Mysql 用于授予/撤销特权的SQL触发器
在mysql 5.1中是否可以创建触发器来授予或撤销用户的权限 我试过这个:Mysql 用于授予/撤销特权的SQL触发器,mysql,sql,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。显性还是
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。显性还是隐性
存储区中不允许提交
功能或触发器
在授予/撤销时仔细检查文档。错误表明它们都是自动提交的。这不能在触发器本身期间发生,因为后者作为正在进行的事务的一部分被触发。您可以直接操作
mysql
数据库中的权限表
表mysql.user
拥有用户的通用权限(对所有数据库的访问权限)表
mysql.db
拥有每个数据库的访问权限table
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允许从存储过程中处理事务。