Quel est le privilège minimum nécessaire pour modifier une contrainte de clé étrangère?

12

Quel est le privilège minimum nécessaire pour modifier une contrainte de clé étrangère?

Mon script de migration a cessé de fonctionner après que MySQL 5.5.41 a corrigé ce bogue:

  • InnoDB a permis la création d'une clé étrangère faisant référence à une table parent pour laquelle l'utilisateur ne disposait pas de privilèges suffisants. (Bogue n ° 18790730)

Je reçois cette erreur:

SQLSTATE [42000]: erreur de syntaxe ou violation d'accès: 1142 commande REFERENCES refusée à l'utilisateur 'foo' @ 'localhost' pour la table 'core.users' (SQL: alter table `user_baz` add constraint user_baz_user_id_foreign) clé étrangère références (` user_id`) `core`.`users` (` id`) sur la cascade de suppression sur la cascade de mise à jour)

Ce qui signifie que je dois réparer les privilèges. Quel est le privilège minimum dont j'ai besoin?

mtmacdonald
la source

Réponses:

15

Vous devez ajouter le privilège "REFERENCES" à votre rôle.

smoothdvd
la source
1
Ce type de réponse "théorique" conduit juste à une recherche supplémentaire sur la façon d'ajouter le privilège dans la pratique. Voir la réponse de @ Yuci, qui donne tous les détails nécessaires. Autrement dit,GRANT REFERENCES ON test.user_baz TO 'foo'@'localhost';
John Mayor
8
GRANT [type of permission] ON [database name].[table name] TO '[username]'@'[host name or IP address]';

Par exemple:

GRANT REFERENCES ON test.user_baz TO 'foo'@'localhost';
Yuci
la source
1

Tout d'abord, si tout le reste échoue, lisez la documentation (section Notes d'utilisation).

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.

Voici un exemple.

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> 
Vérace
la source