Was ist das Mindestprivileg, das zum Ändern einer Fremdschlüsseleinschränkung erforderlich ist?

12

Was ist das Mindestprivileg, das zum Ändern einer Fremdschlüsseleinschränkung erforderlich ist?

Mein Migrationsskript funktionierte nicht mehr, nachdem MySQL 5.5.41 diesen Fehler behoben hatte:

  • InnoDB erlaubte die Erstellung eines Fremdschlüssels, der auf eine übergeordnete Tabelle verwies, für die der Benutzer nicht über ausreichende Berechtigungen verfügte. (Fehler # 18790730)

Ich erhalte diesen Fehler:

SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1142 REFERENCES-Befehl für Benutzer 'foo' @ 'localhost' für Tabelle 'core.users' verweigert (SQL: alter table `user_baz` Einschränkung hinzufügen user_baz_user_id_foreign Fremdschlüsselreferenzen (` user_id`) `core`.`users` (` id`) bei Löschkaskade bei Update-Kaskade)

Was bedeutet, dass ich die Berechtigungen korrigieren muss. Was ist das Mindestprivileg, das ich brauche?

mtmacdonald
quelle

Antworten:

15

Sie müssen Ihrer Rolle das Privileg "REFERENCES" hinzufügen.

glattdvd
quelle
1
Diese Art der "theoretischen" Antwort führt nur dazu, dass zusätzlich gegoogelt wird, wie das Privileg in der Praxis hinzugefügt werden kann. Siehe @ Yucis Antwort, die alle erforderlichen Details enthält. Das heißt,GRANT REFERENCES ON test.user_baz TO 'foo'@'localhost';
John Mayor
7
GRANT [type of permission] ON [database name].[table name] TO '[username]'@'[host name or IP address]';

Zum Beispiel:

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

Wenn alles andere fehlschlägt, lesen Sie zunächst die Dokumentation (Abschnitt Verwendungshinweise).

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.

Unten ist ein Beispiel.

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
quelle