Який мінімальний привілей, необхідний для зміни обмеження іноземного ключа?


12

Який мінімальний привілей, необхідний для зміни обмеження іноземного ключа?

Мій сценарій міграції перестав працювати після того, як MySQL 5.5.41 виправив цю помилку:

  • InnoDB дозволив створити іноземний ключ, який посилався на батьківську таблицю, для якої користувач не мав достатніх привілеїв. (Помилка №18790730)

Я отримую цю помилку:

SQLSTATE [42000]: Помилка синтаксису або порушення доступу: 1142 Команда REFERENCES відхилена користувачеві 'foo' @ 'localhost' для таблиці 'core.users' (SQL: таблиця змінити `user_baz` додати обмеження іноземного ключа user_baz_user_id_foreign (` user_id`)) `core`.`users` (` id`) для видалення каскаду на каскаді оновлень)

Що означає, що мені потрібно виправити привілеї. Який мінімальний привілей мені потрібен?

Відповіді:


15

Вам потрібно додати привілей "СПИСОК" до своєї ролі.


1
Цей тип "теоретичної" відповіді веде лише до додаткового гуглінгу щодо того, як додати привілей на практиці. Дивіться відповідь @ Yuci, в якій наведені всі необхідні деталі. Тобто,GRANT REFERENCES ON test.user_baz TO 'foo'@'localhost';
Іван Мер

8
GRANT [type of permission] ON [database name].[table name] TO '[username]'@'[host name or IP address]';

Наприклад:

GRANT REFERENCES ON test.user_baz TO 'foo'@'localhost';

1

По-перше, якщо все інше не вдається, прочитайте документацію (розділ Примітки щодо використання).

To use `ALTER TABLE`, you need `ALTER`, `CREATE` and `INSERT` privileges for the table. Note that the user (billy) granted these privileges cannot drop the table.

Нижче наведено приклад.

mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |    <=== now root user
+----------------+
1 row in set (0.00 sec)

mysql> CREATE TABLE a(b VARCHAR(3) PRIMARY KEY); <=== Must be PK to be FK in another table.
Query OK, 0 rows affected (0.28 sec)

mysql> CREATE TABLE c(d VARCHAR(3), KEY c_ix (d));
Query OK, 0 rows affected (0.35 sec)

mysql> GRANT ALTER, CREATE, INSERT ON c TO billy;  <=== Privileges to billy
Query OK, 0 rows affected (0.00 sec)

mysql> exit;
Bye

logon as billy

[pol@localhost dbahelper-master]$ /mysql/5.7/inst/bin/mysql -S /mysql/5.7/inst/mysql.sock -u billy -pdba

mysql> use test;
Database changed
mysql> 
mysql> ALTER TABLE c ADD CONSTRAINT fk_c_a FOREIGN KEY (d) REFERENCES a(b);
Query OK, 0 rows affected (0.64 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW CREATE TABLE c;
| c     | CREATE TABLE `c` (
  `d` varchar(3) DEFAULT NULL,
  KEY `c_ix` (`d`),
  CONSTRAINT `fk_c_a` FOREIGN KEY (`d`) REFERENCES `a` (`b`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
mysql> 
mysql> drop table c;
ERROR 1142 (42000): DROP command denied to user 'billy'@'localhost' for table 'c'
mysql> 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.