更改外键约束所需的最低权限是多少?

mtm*_*ald 16 mysql

更改外键约束所需的最低权限是多少?

MySQL 5.5.41修复此错误后,我的迁移脚本停止工作:

  • InnoDB 允许创建一个外键,该外键引用了用户没有足够权限的父表。(错误 #18790730)

我收到此错误:

SQLSTATE[42000]:语法错误或访问冲突:1142 REFERENCES 命令拒绝用户 'foo'@'localhost' 用于表 'core.users'(SQL:alter table `user_baz` 添加约束 user_baz_user_id_foreign 外键(`user_id`)引用`core`.`users`(`id`)在更新级联上删除级联)

这意味着我需要修复权限。我需要的最低权限是多少?

小智 20

您需要为您的角色添加“REFERENCES”权限。

  • 这种类型的“理论”答案仅用于额外搜索如何在实践中添加特权。请参阅@Yuci 的回答,其中提供了所有需要的详细信息。也就是说,`GRANT REFERENCES ON test.user_baz TO 'foo'@'localhost';` (2认同)

小智 12

GRANT [type of permission] ON [database name].[table name] TO '[username]'@'[host name or IP address]';
Run Code Online (Sandbox Code Playgroud)

例如:

GRANT REFERENCES ON test.user_baz TO 'foo'@'localhost';
Run Code Online (Sandbox Code Playgroud)


Vér*_*ace 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.
Run Code Online (Sandbox Code Playgroud)

下面是一个例子。

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> 
Run Code Online (Sandbox Code Playgroud)