TL;DR
タイトルがすべてを物語っている。 SET_USER_ID権限 があるとこのオペレーションは成功する
エラーコードは4006
MySQL error code MY-004006 (ER_CANNOT_USER_REFERENCED_AS_DEFINER): Operation %s failed for %.256s as it is referenced as a definer account in %s.
実はMySQL 8.0.22とそれ以降の新機能らしい
実験。
DROP USER用を試すダミーのアカウントを作ってVIEWのDEFINERに設定する。
mysql80 9> CREATE USER view_dummy;
Query OK, 0 rows affected (0.00 sec)
mysql80 9> CREATE DEFINER=view_dummy VIEW d1.v1 AS SELECT * FROM d1.t1;
Query OK, 0 rows affected (0.02 sec)
root@localhost
( SET_USER_ID
権限を持っている ) で DROP VIEW
した場合はワーニングどまり (4005番なのでこれも新顔のはず, このワーニングは5.7では出ない)
mysql80 9> DROP USER view_dummy;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql80 9> SHOW WARNINGS;
+---------+------+---------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+---------------------------------------------------------------------+
| Warning | 4005 | User 'view_dummy'@'%' is referenced as a definer account in a view. |
+---------+------+---------------------------------------------------------------------+
1 row in set (0.00 sec)
テストのためにもう一回同じ名前でCREATE USERする(この時点でd1.v1は存在していてDEFINERになっているのでもう一度ワーニングは出た)
mysql80 10> CREATE USER view_dummy;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql80 10> SHOW WARNINGS;
+---------+------+---------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+---------------------------------------------------------------------+
| Warning | 4005 | User 'view_dummy'@'%' is referenced as a definer account in a view. |
+---------+------+---------------------------------------------------------------------+
1 row in set (0.00 sec)
今度は SET_USER_ID
権限を持っていないアカウントでログインする。よく見ないとわからないけどよく見ると SET_USER_ID
privはない。
mysql80 12> SHOW GRANTS\G
*************************** 1. row ***************************
Grants for yoku0825@%: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `yoku0825`@`%`
*************************** 2. row ***************************
Grants for yoku0825@%: GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ABORT_EXEMPT,AUDIT_ADMIN,AUTHENTICATION_POLICY_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,FIREWALL_EXEMPT,FLUSH_OPTIMIZER_COSTS,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,GROUP_REPLICATION_ADMIN,GROUP_REPLICATION_STREAM,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,PASSWORDLESS_USER_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SENSITIVE_VARIABLES_OBSERVER,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SHOW_ROUTINE,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,TELEMETRY_LOG_ADMIN,XA_RECOVER_ADMIN ON *.* TO `yoku0825`@`%`
2 rows in set (0.00 sec)
で、 DROP USER
はエラーになる。
mysql80 12> DROP USER view_dummy;
ERROR 4006 (HY000): Operation DROP USER failed for 'view_dummy'@'%' as it is referenced as a definer account in a view.
0 件のコメント :
コメントを投稿