สิทธิ์ขั้นต่ำที่จำเป็นในการแก้ไขข้อ จำกัด กุญแจต่างประเทศคืออะไร


12

สิทธิ์ขั้นต่ำที่จำเป็นในการแก้ไขข้อ จำกัด กุญแจต่างประเทศคืออะไร

สคริปต์การย้ายข้อมูลของฉันหยุดทำงานหลังจากMySQL 5.5.41แก้ไขข้อผิดพลาดนี้:

  • InnoDB อนุญาตให้สร้างคีย์ต่างประเทศซึ่งอ้างถึงตารางหลักซึ่งผู้ใช้มีสิทธิ์ไม่เพียงพอ (Bug # 18790730)

ฉันได้รับข้อผิดพลาดนี้:

SQLSTATE [42000]: ข้อผิดพลาดทางไวยากรณ์หรือการละเมิดการเข้าถึง: คำสั่งอ้างอิง 1142 ปฏิเสธการอ้างอิงถึงผู้ใช้ 'foo' @ 'localhost' สำหรับตาราง 'core.users' (SQL: แก้ไขตาราง `user_baz` เพิ่มข้อ จำกัด user_baz_user_id_foreign คีย์ต่างประเทศ (` user_id`) `core`.`users` (` id`) ในการลบ cascade ในการปรับปรุง cascade)

ซึ่งหมายความว่าฉันต้องแก้ไขสิทธิ์ สิทธิ์ขั้นต่ำที่ฉันต้องการคืออะไร

คำตอบ:


15

คุณต้องเพิ่มสิทธิ์ "ผู้อ้างอิง" ในบทบาทของคุณ


1
คำตอบ "เชิงทฤษฎี" ประเภทนี้นำไปสู่การ googling เพิ่มเติมเกี่ยวกับวิธีการเพิ่มสิทธิพิเศษในทางปฏิบัติ ดูคำตอบของ @ Yuci ซึ่งให้รายละเอียดที่จำเป็นทั้งหมด นั่นคือGRANT REFERENCES ON test.user_baz TO 'foo'@'localhost';
จอห์นนายกเทศมนตรี

8
GRANT [type of permission] ON [database name].[table name] TO '[username]'@'[host name or IP address]';

ตัวอย่างเช่น:

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

1

ก่อนอื่นหากสิ่งอื่นล้มเหลวให้อ่านเอกสาร (ส่วนหมายเหตุการใช้งาน)

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.

ด้านล่างเป็นตัวอย่าง

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> 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.