¿Cuál es el privilegio mínimo necesario para alterar una restricción de clave externa?

12

¿Cuál es el privilegio mínimo necesario para alterar una restricción de clave externa?

Mi script de migración dejó de funcionar después de que MySQL 5.5.41 solucionó este error:

  • InnoDB permitió la creación de una clave externa que hacía referencia a una tabla primaria para la cual el usuario no tenía suficientes privilegios. (Error # 18790730)

Me sale este error:

SQLSTATE [42000]: Error de sintaxis o violación de acceso: 1142 REFERENCIAS comando denegado al usuario 'foo' @ 'localhost' para la tabla 'core.users' (SQL: alterar tabla `user_baz` agregar restricción user_baz_user_id_foreign clave externa (` user_id`) referencias `core` .users` (` id`) en delete cascade en update cascade)

Lo que significa que necesito arreglar los privilegios. ¿Cuál es el privilegio mínimo que necesito?

mtmacdonald
fuente

Respuestas:

15

Debe agregar el privilegio "REFERENCIAS" a su rol.

smoothdvd
fuente
1
Este tipo de respuesta "teórica" ​​lleva solo a googlear más sobre cómo agregar el privilegio en la práctica. Vea la respuesta de @ Yuci, que brinda todos los detalles necesarios. Es decir,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]';

Por ejemplo:

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

En primer lugar, si todo lo demás falla, lea la documentación (sección Notas de uso).

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.

A continuación se muestra un ejemplo.

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
fuente