首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于授予/撤消权限的SQL触发器

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

Stack Overflow用户
提问于 2011-05-28 13:55:43
回答 2查看 857关注 0票数 4

是否可以创建触发器来授予或撤销MySQL5.1中的用户权限?

我试过这个:

代码语言:javascript
复制
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年。在存储的函数或触发器中不允许显式或隐式提交。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-28 14:34:45

您可以直接操作mysql数据库中的权限表。

表mysql.user拥有用户的普遍权利(对所有数据库的访问权)

表mysql.db保存每个数据库的访问权限

表mysql.table_priv:每个表的访问权限

将触发器更改为:

代码语言:javascript
复制
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已经解释过的那样。

​

警告

请注意,mysql模式的结构可能会发生变化(并且在过去已经发生了变化)。

如果发生这种情况,您的查询可能会中断。

GRANT/REVOKE没有这个问题。

请谨慎使用这类代码,并检查升级MySQL服务器时是否一切都正常。

票数 2
EN

Stack Overflow用户

发布于 2011-05-28 13:59:24

在授权/撤销时再检查一遍文档。错误是暗示他们都是自动提交的。在触发器本身期间不能发生这种情况,因为触发器是作为正在进行的事务的一部分触发的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6162052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档