2013-02-06 117 views
0

我真的很希望有人能幫助我解決這個問題,因爲它已經困擾了我好幾天。我的用戶表上有一個after插入觸發器,用於在每次插入後將記錄插入到審計表中。這工作正常,如果我在手動執行插入語句的命令行。但是,當我的Web表單插入到表中時,插入到審計表中的所有值都是空值。我想也許這是一個權限問題,所以我將CURRENT_USER()和USER()添加到要插入審計表的觸發器中。這表明觸發器正由觸發器的所有者「admin」用戶執行。MySQL「插入後」觸發器不斷插入空值

這裏是我的觸發器:

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 
^^ 

這將插入到審計表如下:管理@本地,NULL,NULL

這裏是管理用戶的權限:

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

就像我說的,它可以完美地從mysql命令行運行。但由於某種原因,從網絡表單執行時,「新」值都是空值。

請幫忙。提前致謝。

UPDATE在2013年2月6日:

我嘗試過類似扳機但「AFTER UPDATE」,它工作正常。所以這個問題是孤立的插入。這也證明,這不是一個權限問題。

+0

可能是與用戶權限的問題......你使用相同的MySQL用戶在命令行上並在網絡應用程序? –

+0

是的。我使用兩個管理員帳戶。 – Caesar

+0

我也看到這篇文章,並選中「autocommit」,發現它在我的系統上默認打開,所以沒有幫助:http://stackoverflow.com/questions/2921546/mysql-trigger-works-after- console-insert-but-not-after-script-insert?rq = 1 – Caesar

回答

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 
^^ 
0

看起來像是一個網頁表單的問題。檢查插入到Users表中的值。他們是否爲NULL?

您可以在觸發改變的INSERT語句 -

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

,並確保觸發正常工作。

+0

感謝您的回覆。您的聲明正常工作正如我在我的原始文章中所述。在我的帖子中注意到「USER()」的值被插入到審計表中。問題在於使用「NEW」提供的值。 – Caesar

+0

如果NEW值爲NULL,那麼您試圖將NULL值插入'Users'表中。從'用戶'表中選擇數據。 – Devart