2011-05-28 40 views
4

是否可以創建觸發器來授予或撤銷對mysql 5.1中的用戶的權限?授予/撤銷privilages的SQL觸發器

我想這一個:

delimiter // 

create trigger sup_tog 
before update on members 
for each row begin 
if old.fname = "xyz" and new.status = "b" 
then 
revoke select, update on mkdb.* from xyz; 
end if; 

end// 

,我得到的錯誤信息是:

錯誤代碼:1422採用直接或間接 提交不允許在存儲 功能或觸發。

回答

2

您可以直接操作mysql數據庫中的權限表。

mysql.user適用於用戶(對所有數據庫的訪問權限)普遍權利
mysql.db持有每個數據庫的訪問權限
mysql.table_priv:每桌訪問權限

更改您的觸發到:

DELIMITER $$ 

CREATE TRIGGER bu_members BEFORE UPDATE ON members FOR EACH ROW 
BEGIN 
    IF old.fname = "xyz" AND new.status = "b" THEN BEGIN 
    /*revoke select, update on mkdb.* from xyz;*/ 
    UPDATE mysql.db SET 
     select_priv = 'N' 
     , update_priv = 'N' 
    WHERE mysql.db.user = 'xyz' AND mysql.db.db = 'mkdb'; 
    END; END IF; 

END $$ 

請注意,更改將僅在當前事務結束後生效。
這個必須在@Denis已經解釋過的觸發器之外發生。

enter image description here警告
當心的是,mysql模式的結構可以改變(和過去發生了變化)
如果發生這種情況,您的查詢可能會中斷。
GRANT/REVOKE沒有這個問題。
請謹慎使用此類代碼,並檢查是否所有東西在您升級MySQL服務器時仍然有效。

+0

+1的警告。 :-)他可能用存儲過程而不是觸發器來管理。 – 2011-05-28 14:45:31

+1

@Denis,調用'revoke'的存儲過程將產生相同的錯誤。嵌套不會欺騙服務器。 – Johan 2011-05-28 14:57:30

+0

哦,好的......我認爲MySQL允許在存儲過程中處理事務。 – 2011-05-28 15:14:11

2

仔細檢查授予/撤消文檔。錯誤是暗示它們都是自動提交的。在觸發器本身中不會發生這種情況,因爲後者會在正在進行的事務中被觸發。

+0

那麼有沒有其他方法可以在主動數據庫中完成同樣的任務? – mihsathe 2011-05-28 14:08:14

+0

嘗試使用存儲過程。除非我誤解,否則這些允許操縱交易。 – 2011-05-28 14:38:21

相關問題