是否可以创建在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。显式或隐式 存储中不允许提交 功能或触发器。
答案 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已经解释过了。
警告
请注意mysql
架构的结构可以更改(并且过去已更改)。
如果发生这种情况,您的查询可能会中断
GRANT
/ REVOKE
没有这个问题
请谨慎使用此类代码,并在升级MySQL服务器时检查一切是否仍然有效。