0

何日も悩まされているので、誰かがこれを手伝ってくれることを本当に願っています。users テーブルに after insert トリガーがあり、挿入のたびにレコードを監査テーブルに挿入します。コマンドラインでinsertステートメントを手動で実行している場合、これは正常に機能します。ただし、Web フォームがテーブルに挿入されると、監査テーブルに挿入されるすべての値が null になります。おそらく権限の問題だと思っているので、監査テーブルに挿入するトリガーに 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" 値がすべて null になります。

助けてください。前もって感謝します。

2013 年 2 月 6 日の更新:

同様のトリガーを試しましたが、「AFTER UPDATE」を使用すると正しく機能しました。したがって、問題は挿入に分離されます。また、これは許可の問題ではないことも証明しています。

4

2 に答える 2

0

Webフォームに問題があるようです。Usersテーブルに挿入されている値を確認してください。それらはNULLですか?

トリガーのINSERTステートメントを変更できます-

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

トリガーが正しく機能することを確認してください。

于 2013-02-06T08:53:58.607 に答える
0

さて、さまざまなタイプのトリガーを作成して実験した後、挿入トリガーが何らかの理由で複数回起動し、実際には挿入トリガーと更新トリガーの両方を起動し、最後の行には常に挿入された唯一のレコードである null があることがわかりました。 . それは本当に奇妙です。とにかく、これを回避するために、コードをこれに変更しましたが、これまでのところ問題なく動作しています:

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 に答える