2014-05-20 73 views
0

我有一個表discussions,它存儲我的網站上的帖子數據。mysql觸發器的奇怪行爲

現在我有2個觸發器,其中一個插入path列時添加新行,另外一個用於更新一行時更新path如下:

CREATE TRIGGER discussions_trigger BEFORE INSERT ON discussions FOR EACH ROW 
BEGIN 
DECLARE next_id INT; 
SET next_id = (SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='discussions'); 
IF(NEW.visibility<1) 
THEN 
SET NEW.path = CONCAT('discussions.php?id=',next_id); 
ELSEIF(NEW.visibility>=1) 
THEN 
SET NEW.path = CONCAT('private.php?id=',next_id); 
END IF; 

CREATE TRIGGER discussions_update_trigger BEFORE UPDATE ON discussions FOR EACH ROW 
BEGIN 
DECLARE next_id INT; 
SET next_id = OLD.id; 
IF(NEW.visibility<1) 
THEN 
SET NEW.path = CONCAT('discussions.php?id=',next_id); 
ELSEIF(NEW.visibility>=1) 
THEN 
SET NEW.path = CONCAT('private.php?id=',next_id); 
END IF; 

這枚作品應該每隔一段時間,當我嘗試插入或更新表discussions時,出現以下錯誤:

用戶'abhishek'@'An unknown IP'未定義。

但是,用戶abhishek只允許從localhost

嘗試了一切後,我發現刪除觸發器,然後重新創建它們可以解決問題。當我再次遇到錯誤時,我重新創建了觸發器並且它工作正常。這裏有什麼問題?

+0

你是如何創建觸發器?它是通過'mysqli'嗎?另外,你能列出DB上觸發器的細節嗎?使用'如何觸發\ G'並檢查'definer'的值?它是'user @ localhost'? – visakh

+0

@visakh我使用默認的mysql客戶端創建觸發器。看來我不能在mysql客戶端中使用'如何觸發\ G'。它給出了錯誤。 –

+0

對不起,這是一個類型從我的結束...命令是'show triggers \ G' – visakh

回答

1

運行show triggers\G並檢查DEFINER是否設置爲[email protected]

如果不是,則將TRIGGERDEFINER修改爲[email protected]。語法如下:

CREATE DEFINER='username'@'localhost' TRIGGER trigger_name trigger definition

有關詳細討論,請參見注釋的問題。