2011-05-28 76 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