【问题标题】:Restrict insert permissions on a single table in MySQL限制 MySQL 中单个表的插入权限
【发布时间】:2020-04-17 00:57:42
【问题描述】:

我有一个 MySQL 表,需要 INSERT 的受限权限。

具体来说,我写了一个存储函数来处理所有INSERT 操作,我需要限制权限,所以只有这个存储函数可以插入行这个特定的表。

“但你为什么要这么做?”

因为 MySQL 不支持 Microsoft 的 INSTEAD OF INSERT 触发器,并且用于插入的自定义存储函数/过程是唯一可行的解​​决方法。
我需要它像触发器一样工作 - 保证为每个INSERT 操作执行,没有例外或漏洞。

如果没有错误,该函数返回 0,如果参数无效,则返回 1,如果唯一索引冲突,则返回 2,等等。
(或者函数可能会包含一个INSERT ... ON DUPLICATE KEY UPDATE 声明,我还没有决定。)

“但为什么需要 INSTEAD OF INSERT 触发器?”

与 Microsoft SQL Server 开发人员需要它的原因相同......因为它完成了需要完成的工作......
具体来说,因为我的代码包括GET_LOCK before 插入和RELEASE_LOCK after 插入......而且我不希望BEFORE INSERT 触发器在不释放的情况下结束锁(似乎是个非常糟糕的主意)。

【问题讨论】:

  • 各种 SQL 实现以不同的方式处理事务。如果您描述您的需求而不是简单地参考 SQL Server 的事务语义,我们可能会更好地帮助您。请edit您的问题。

标签: mysql sql triggers permissions


【解决方案1】:

您可以创建包含子句 SQL SECURITY DEFINER 的 MySQL 存储函数(和存储过程)。然后,他们将run with the permissions of the definer, not the user。您的定义可能如下所示:

CREATE PROCEDURE proc()
       SQL SECURITY DEFINER
BEGIN
   INSERT INTO tbl whatever....;
END;

执行此操作时,请使用管理员帐户而不是用户帐户登录 MySQL。

然后使用 MySQL 的权限系统将对该表的 INSERT 访问权限授予管理员帐户,并将revoke it 授予其他用户帐户。

GRANT SELECT, UPDATE, INSERT, DELETE mydatabase.mytable TO admin;
REVOKE INSERT ON mydatabase.mytable FROM user1;
REVOKE INSERT ON mydatabase.mytable FROM user2;

那么,来自其他用户账户的INSERT查询会失败,但存储函数会成功。这或多或少是传统的 SQL 存储代码特权处理。

任何类型的 MySQL 触发器都无法启动或结束事务。

【讨论】:

    猜你喜欢
    • 2018-01-08
    • 1970-01-01
    • 2019-08-24
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    相关资源
    最近更新 更多