我真的希望有人可以帮我解决这个问题,因为它已经困扰了我好几天。我的users表上有一个后插入触发器,它在每次插入后将记录插入到审计表中。如果我在命令行上手动执行insert语句,这可以正常工作。但是,当我的Web表单插入表中时,插入审计表的所有值都为空。我想也许这是一个权限问题,所以我将CURRENT_USER()和USER()添加到要插入审计表的触发器中。它显示触发器正由“admin”用户执行,该用户是触发器的所有者。
这是我的触发器:
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表单执行时,“NEW”值都为空。
请帮忙。提前谢谢。
2013年2月6日更新:
我尝试了类似的触发器但是“更新后”并且它正常工作。所以这个问题与插入有关。这也证明了这不是一个许可问题。
答案 0 :(得分:0)
看起来像网络表单的问题。检查插入Users
表的值。它们是NULL吗?
您可以在触发器中更改INSERT语句 -
INSERT INTO `users_audit` (`username`, `address`, `email`)
VALUES (USER(), 'temp address', 'temp email');
确保触发器正常工作。
答案 1 :(得分: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
^^