Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 用于授予/撤销特权的SQL触发器_Mysql_Sql - Fatal编程技术网

Mysql 用于授予/撤销特权的SQL触发器

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。显性还是

在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。显性还是隐性 存储区中不允许提交 功能或触发器


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

您可以直接操作
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允许从存储过程中处理事务。