0

我真的希望有人可以帮助我解决这个问题,因为它已经困扰了我好几天了。我的用户表上有一个插入后触发器,它在每次插入后将一条记录插入到审计表中。如果我在命令行上手动执行插入语句,这可以正常工作。但是,当我的 Web 表单插入到表中时,插入到审计表中的所有值都是空值。我在想这可能是权限问题,所以我将 CURRENT_USER() 和 USER() 添加到要插入到审计表中的触发器中。它显示触发器正在由“管理员”用户执行,该用户是触发器的所有者。

这是我的触发器:

DELIMITER ^^
CREATE TRIGGER UsersInsert AFTER INSERT ON Users
FOR EACH ROW
BEGIN

INSERT INTO `users_audit` (`username`, `address`, `email`)
VALUES
(USER(), NEW.address, NEW.email);

END
^^

这将在审计表中插入以下内容:admin@localhost, null, null

以下是管理员用户的权限:

GRANT ALL PRIVILEGES ON `MyDB`.* TO 'admin'@'localhost' WITH GRANT OPTION

就像我说的,它可以从 mysql 命令行完美运行。但由于某种原因,当从 Web 表单执行时,“新”值都是空值。

请帮忙。提前致谢。

2013 年 2 月 6 日更新:

我尝试了类似的触发器,但使用“更新后”并且它工作正常。所以这个问题被隔离到插入。这也证明这不是权限问题。

4

2 回答 2

0

看起来像网络表单的问题。检查插入到Users表中的值。他们是空的吗?

您可以更改触发器中的 INSERT 语句 -

INSERT INTO `users_audit` (`username`, `address`, `email`)
VALUES (USER(), 'temp address', 'temp email');

并确保触发器正常工作。

于 2013-02-06T08:53:58.607 回答
0

好吧,在创建不同类型的触发器并进行试验之后,我认为插入触发器可能由于某种原因多次触发,实际上同时触发了插入和更新触发器,最后一行总是有空值,这是唯一插入的记录. 这真的很奇怪。所以无论如何,为了解决这个问题,我将我的代码更改为这个,到目前为止它没有任何问题:

DELIMITER ^^

CREATE TRIGGER UsersUpdate AFTER UPDATE ON users
FOR EACH ROW
BEGIN

IF NEW.username IS NOT NULL THEN

IF EXISTS (SELECT 1 FROM users_audit WHERE username = NEW.username) THEN
UPDATE users_audit SET `username` = NEW.username,  `FirstName` = NEW.FirstName, `LastName` = NEW.LastName, `address` = NEW.address, `email` = NEW.email WHERE username = OLD.username;
ELSE
INSERT INTO users_audit (`username`, `FirstName`, `LastName`, `address`, `email`)
VALUES (NEW.username, NEW.FirstName, NEW.LastName, NEW.address, NEW.email);
END IF;

END IF;

END
^^
于 2013-02-06T19:49:13.610 回答