Какая минимальная привилегия необходима для изменения ограничения внешнего ключа?

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`) при удалении каскада при обновлении каскада)

Что означает, что мне нужно исправить привилегии. Какая минимальная привилегия мне нужна?

mtmacdonald
источник

Ответы:

15

Вам необходимо добавить привилегию «ССЫЛКИ» в вашу роль.

smoothdvd
источник
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> 
Verace
источник