用于授予/撤消权限的SQL触发器

时间:2011-05-28 13:55:44

标签: mysql sql

是否可以创建在mysql 5.1中为用户授予或撤消权限的触发器?

我试过这个:

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 个答案:

答案 0 :(得分:2)

仔细检查授予/撤销时的文档。错误表明他们都是自动提交。这在触发器本身期间不会发生,因为后者在正在进行的事务中被触发。

答案 1 :(得分: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服务器时检查一切是否仍然有效。