Apa hak minimum yang diperlukan untuk mengubah batasan kunci asing?

12

Apa hak minimum yang diperlukan untuk mengubah batasan kunci asing?

Skrip migrasi saya berhenti berfungsi setelah MySQL 5.5.41 memperbaiki bug ini:

  • InnoDB mengizinkan kunci asing untuk dibuat yang mereferensikan tabel induk di mana pengguna tidak memiliki hak yang memadai. (Bug # 18790730)

Saya mendapatkan kesalahan ini:

SQLSTATE [42000]: Kesalahan sintaksis atau pelanggaran akses: 1142 REFERENSI perintah ditolak untuk pengguna 'foo' @ 'localhost' untuk tabel 'core.users' (SQL: ubah tabel `user_baz` tambahkan batasan user_baz_user_id_foreign kunci asing (` user_id`) referensi `core`.`users` (` id`) pada penghapusan kaskade saat kaskade pembaruan)

Yang berarti saya harus memperbaiki hak istimewa. Apa hak minimum yang saya butuhkan?

mtmacdonald
sumber

Jawaban:

15

Anda perlu menambahkan hak istimewa "REFERENSI" ke peran Anda.

smoothdvd
sumber
1
Jenis jawaban "teoretis" ini mengarah hanya untuk googling tambahan tentang cara menambahkan hak istimewa dalam praktik. Lihat jawaban @ Yuci, yang memberikan semua detail yang dibutuhkan. Yaitu,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]';

Sebagai contoh:

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

Pertama, jika semuanya gagal, baca dokumentasi (bagian Catatan Penggunaan).

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.

Di bawah ini adalah contohnya.

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
sumber