授予/撤销权限的 SQL 触发器
Posted
技术标签:
【中文标题】授予/撤销权限的 SQL 触发器【英文标题】:SQL triggers for granting/revoking privilages 【发布时间】:2011-05-28 13:55:43 【问题描述】:是否可以在 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。显式或隐式 存储中不允许提交 函数或触发器。
【问题讨论】:
【参考方案1】:您可以直接操作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 已经解释的那样,这必须在触发器之外发生。
警告
请注意,mysql
架构的结构可能会发生变化(过去也发生过变化)。
如果发生这种情况,您的查询可能会中断。GRANT
/REVOKE
没有这个问题。
谨慎使用此类代码,并检查升级 MySQL 服务器后是否一切正常。
【讨论】:
+1 表示警告。 :-) 他可能使用存储过程而不是触发器来管理。 @Denis,调用revoke
的存储过程会产生同样的错误。嵌套不会欺骗服务器。
哦,好吧...我认为 MySQL 允许从存储过程中处理事务。【参考方案2】:
仔细检查有关授予/撤销的文档。该错误表明它们都会自动提交。这在触发器本身期间不会发生,因为后者会作为正在进行的事务的一部分被触发。
【讨论】:
那么有没有其他方法可以在活动数据库中完成相同的操作? 尝试使用存储过程。除非我弄错了,否则这些允许操纵交易。以上是关于授予/撤销权限的 SQL 触发器的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 基础 SQL -- DCL 数据控制语言 DBA常用(用户管理:查询用户创建用户修改用户密码删除用户,权限控制:查询权限授予权限撤销权限)