为什么/何时创建 mysql 触发器需要超级权限?

Joh*_*nst 5 mysql trigger security

我试图解析和理解 MySQL 文档所说的何时创建触发器需要 SUPER 权限。他们说:

如果启用了二进制日志,CREATE TRIGGER 可能需要 SUPER 权限[1]

这种暗示在某些情况下它不需要 SUPER 特权。他们指的是 log_bin_trust_function_creators=1 设置,还是还有其他东西?

其次,在[2]中他们说:

... 信任不会创建将导致不安全事件写入二进制日志的存储函数。

这里究竟有什么危险?二进制日志中哪些类型的事件可能是“不安全的”,对谁来说?

[1] https://dev.mysql.com/doc/refman/5.7/en/create-trigger.html

[2] https://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_log_bin_trust_function_creators

Rol*_*DBA 4

对于SUPERTRIGGER权限,您需要 TRIGGER 权限才能在您有权访问的表上创建触发器。

\n\n

如果您播放二进制日志,则可能会看到在您无权的表上创建触发器的命令。MySQL 文档暗示了这一点:

\n\n
\n

CREATE TRIGGER 需要与触发器关联的表的 TRIGGER 权限。该语句可能还需要 SUPER 权限,具体取决于 DEFINER 值,如本节后面所述。如果启用了二进制日志记录,CREATE TRIGGER 可能需要 SUPER 权限,如第 19.7 节 \xe2\x80\x9c 存储程序的二进制日志记录\xe2\x80\x9d 中所述。

\n
\n\n

关于你的第二点

\n\n
\n

信任不会创建会导致不安全事件写入二进制日志的存储函数。

\n
\n\n

有时,主设备上的某些 SELECT 可能会在从设备上产生不同的结果。例如,假设您在 MASTER 上运行此查询

\n\n
SELECT * FROM tbl WHERE name=\'...\' LIMIT 10;\n
Run Code Online (Sandbox Code Playgroud)\n\n

SLAVE 怎么会产生不同的结果呢?

\n\n

如果主服务器上发生了数百个 INSERT 命令,它们会在二进制日志中序列化。即使数据库连接 1 在数据库连接 2 之前完成 INSERT,数据库连接 2 也有可能在数据库连接 1 之前将其事件写入主服务器的二进制日志中。在写入密集型、重型 OLAP 中尤其如此。环境。这将制作一个从属副本tbl在物理上与其主副本不同步。运行查询可以隐藏这一点。

\n\n

好吧,您可能认为这只是一个 SELECT。

\n\n

SELECT 不在二进制日志中。插入、删除和更新是。

\n\n

您知道可以执行这样的查询吗?

\n\n
DELETE FROM tbl LIMIT 10;\n
Run Code Online (Sandbox Code Playgroud)\n\n

复制这个确实可以使tbl不同步。

\n\n

如果存储函数中的代码不是这样,那么存储函数也会遇到这个令人头痛的问题DETERMINISTIC。这就是为什么log_bin_trust_function_creators发明这减轻了 mysqld 确定数据操作是否在复制方面同步的责任。是的,他们绕开了下游复制问题。

\n