阻塞删除数据库命令

7 mysql

我创建了一个 MySQL 数据库,并创建了一个专用于该数据库的具有所有权限的新用户。新用户然后继续删除除所有表之外的数据库。我需要阻止该用户被允许删除数据库,但允许他删除其他任何内容。

我的问题是:MySQL 中是否有类似于 MSSql 的服务器级触发器,或者是否有另一种方法可以做到这一点?

Rol*_*DBA 10

也许您想在全局用户级别删除 DROP 权限

UPDATE mysql.user SET drop_priv = 'N' WHERE user='...' AND host='...' and db='...';
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

需要记住的一点:DROP权限包括数据库、表和视图。不幸的是,DROP DATABASEDROP TABLE属于相同的权限范围。

例如

我创建了一个名为 kumar 的用户和一个名为 kumar 的数据库

mysql> create database kumar;
Query OK, 1 row affected (0.00 sec)

mysql> grant all on kumar.* to kumar@'%';
Query OK, 0 rows affected (0.06 sec)

mysql> use kumar
Database changed
mysql> create table rolando (a int);
Query OK, 0 rows affected (0.08 sec)
Run Code Online (Sandbox Code Playgroud)

我以 kumar 的身份登录 mysql 并删除了数据库 kumar

mysql> drop database kumar;
Query OK, 1 row affected (0.07 sec)
Run Code Online (Sandbox Code Playgroud)

所以,我以超级用户的身份重新创建了它。我还创建了一个数据库 kumar2

mysql> create database kumar;
Query OK, 1 row affected (0.00 sec)

mysql> use kumar
Database changed
mysql> create table rolando (a int);
Query OK, 0 rows affected (0.07 sec)

mysql> create database kumar2;
Query OK, 1 row affected (0.00 sec)

mysql>
Run Code Online (Sandbox Code Playgroud)

我试图放弃 kumar2

mysql> show grants for kumar@'%';
+--------------------------------------------------+
| Grants for kumar@%                               |
+--------------------------------------------------+
| GRANT USAGE ON *.* TO 'kumar'@'%'                |
| GRANT ALL PRIVILEGES ON `kumar`.* TO 'kumar'@'%' |
+--------------------------------------------------+
2 rows in set (0.00 sec)

mysql> select user(),current_user();
+-----------------+----------------+
| user()          | current_user() |
+-----------------+----------------+
| kumar@localhost | kumar@%        |
+-----------------+----------------+
1 row in set (0.00 sec)

mysql> drop database kumar2;
ERROR 1044 (42000): Access denied for user 'kumar'@'%' to database 'kumar2'
mysql>
Run Code Online (Sandbox Code Playgroud)

因此,kumar@'%' 只能删除 kumar 数据库。kumar@'%' 不能删除任何其他数据库。

结论

用户 kumar@'%' 可以删除以下内容:

  • kumar 数据库中的所有视图
  • kumar 数据库中的所有表
  • kumar 数据库本身

您可以允许该用户访问 kumar 数据库的所有三个或限制所有三个。


小智 4

不要授予您的用户对数据库和/或服务器的所有权限。独立对数据库、服务器和表使用 GRANT 权限。

Mysql“权限”:http://dev.mysql.com/doc/refman/5.1/en/grant.html#grant-database-privileges

例如 :

GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';
GRANT ALL ON mydb.mytbl TO 'someuser'@'somehost';
Run Code Online (Sandbox Code Playgroud)