【发布时间】:2021-12-28 15:22:38
【问题描述】:
我正在尝试向数据库中的表添加外键。让我们考虑以下最小示例:
CREATE DATABASE db_foo;
USE db_foo;
CREATE TABLE a(b VARCHAR(3) PRIMARY KEY);
CREATE TABLE c(d VARCHAR(3), KEY c_ix (d));
ALTER TABLE c ADD CONSTRAINT fk_c_a FOREIGN KEY (d) REFERENCES a(b);
上面给出的代码在 5.0.95 版本的 MySQL 服务器上完美运行,但是当我在另一台运行 MySQL 5.7.12 版本的服务器上运行它时出现以下错误:
ERROR 1142 (42000): REFERENCES command denied to user 'toto'@'xxx.xxx.xx.xx' for table 'a'
所以我的第一个猜测是检查我在两台服务器上是否拥有相同的权限。这是SHOW GRANTS;的输出:
在装有 MySQL 5.0.95 的服务器上:
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for toto@% |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'toto'@'%' IDENTIFIED BY PASSWORD '*********' |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE ON `db\_%`.* TO 'toto'@'%' |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
在装有 MySQL 5.7.12 的服务器上:
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for toto@% |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'toto'@'%' |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `db\_%`.* TO 'toto'@'%' |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
我不知道为什么它会在一个案例中起作用,而不是在另一个案例中,因为我似乎在这两种情况下都拥有相同的特权。有什么建议吗?
【问题讨论】:
-
第二种情况你没有密码,尝试添加密码然后回复我..
-
嗨,在这两种情况下,我都使用相同的登录程序,密码:
mysql -h <host> -u'toto' -p<password>。不知道为什么它没有出现在show grants;输出中。 -
如果您缺少引用权限,为什么不授予它呢?错误消息清楚地说明了这里出了什么问题。你在 5.0 中不需要它的原因是这个权限是在 MySQL 5.7.6 中引入的。还有 5027373 个其他细节在 5.7 中的工作方式与在 5.0 中的不同。等到你使用你的第一个旧
group by-语句。因此,只需听取错误消息并相应地调整您的数据库。如果不进行更改,您将无法完全更新 11 年前的数据库。 -
这确实是 MySQL 5.7 比 5.0 更冗长的问题...我没有在工作中打扰数据库管理员,但添加
REFERENCES权限就解决了这个问题。跨度> -
如果有人想回答这个问题,我可以接受并关闭问题。