Jakie są minimalne uprawnienia potrzebne do zmiany ograniczenia klucza obcego?

12

Jakie są minimalne uprawnienia potrzebne do zmiany ograniczenia klucza obcego?

Mój skrypt migracji przestał działać po naprawieniu tego błędu przez MySQL 5.5.41 :

  • InnoDB zezwoliło na utworzenie klucza obcego, który odwoływał się do tabeli nadrzędnej, dla której użytkownik nie miał wystarczających uprawnień. (Bug # 18790730)

Otrzymuję ten błąd:

SQLSTATE [42000]: Błąd składniowy lub naruszenie dostępu: komenda 1142 REFERENCES odmówiona użytkownikowi 'foo' @ 'localhost' dla tabeli 'core.users' (SQL: zmiana tabeli `user_baz` dodaj ograniczenie referencje user_baz_user_id_foreign klucz obcy referencje (` user_id`) `core` .użytkownicy` (` id`) przy kasowaniu kasowania przy kaskadzie aktualizacji)

Co oznacza, że ​​muszę naprawić uprawnienia. Jakiego minimalnego uprawnienia potrzebuję?

Mtmacdonald
źródło

Odpowiedzi:

15

Do swojej roli musisz dodać uprawnienie „ODNIESIENIA”.

smoothdvd
źródło
1
Ten rodzaj „teoretycznej” odpowiedzi prowadzi tylko do dodatkowego wyszukiwania w Google, jak dodać przywilej w praktyce. Zobacz odpowiedź @ Yuci, która zawiera wszystkie potrzebne szczegóły. To znaczyGRANT 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]';

Na przykład:

GRANT REFERENCES ON test.user_baz TO 'foo'@'localhost';
Yuci
źródło
1

Po pierwsze, jeśli wszystko inne zawiedzie, przeczytaj dokumentację (sekcja Uwagi dotyczące użytkowania).

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.

Poniżej znajduje się przykład.

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
źródło