protected_databases

protected_databases 系统变量指定一个逗号分隔的数据库名称列表,这些数据库的 DROP 及 其他破坏性 DDL/DML 操作对非管理员用户受保护。一旦某个数据库被列入 protected_databases,非 accountadminsys 角色的用户将无法删除该数据库、在其 中创建对象或修改其数据。这为防止关键数据库的意外或未授权破坏提供了一道防线。

protected_databases 系统变量是一个仅全局级别的设置,定义哪些数据库对普通用户的 DROP DATABASE、DDL 修改和数据操作受保护。只有管理员用户可以修改受保护的数据库或更改 protected_databases 列表。该变量在生产环境中很有用,可防止重要数据库被意外删除。

语法

SET GLOBAL protected_databases = ‘db1,db2,db3’;

查询当前值:

SHOW VARIABLES LIKE ‘protected_databases’; SELECT @@global.protected_databases;

参数说明

属性

变量类型

string

作用域

Global

是否动态

默认值

""

可选值

逗号分隔的数据库名称

示例

DROP DATABASE IF EXISTS protected_demo;
CREATE DATABASE protected_demo;
USE protected_demo;

CREATE TABLE t1(a INT PRIMARY KEY, b INT);
INSERT INTO t1 VALUES (1, 1);

SET GLOBAL protected_databases = 'protected_demo';
SELECT @@global.protected_databases;

SELECT a FROM t1;

SET GLOBAL protected_databases = 'unused_value';
DROP DATABASE protected_demo;

限制

  • protected_databases仅全局变量,不能在会话级别设置。

  • 不能通过设置为 ''',' 来清空列表;这些尝试将引发内部错误。要有效解除保护,可将 其设为一个不与任何现有数据库匹配的占位名称(例如 'unused_value')。

  • lower_case_table_names 设为 0 时,列表中的数据库名称区分大小写。当 lower_case_table_names1 时,所有名称以小写形式比较。

  • 受保护数据库会阻止非管理员用户执行 DDL(CREATE、ALTER、DROP、RENAME、CREATE INDEX、 DROP INDEX、CREATE VIEW、DROP VIEW、ALTER VIEW)、DML(INSERT、UPDATE、DELETE、REPLACE、 TRUNCATE)以及 clone/snapshot 操作。

  • accountadminsys 角色对受保护数据库保留完全访问权限。