【问题标题】:MySQL - Impossible to use REFERENCES on mysql 5.7 (but was working on 5.0)MySQL - 无法在 mysql 5.7 上使用 REFERENCES(但在 5.0 上工作)
【发布时间】: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 权限就解决了这个问题。跨度>
  • 如果有人想回答这个问题,我可以接受并关闭问题。

标签: mysql sql


【解决方案1】:

在 MySQL 5.0/5.1/5.4 中,REFERENCES 授权尚未实现。

我第一次看到这是在 MySQL 5.5 中,但它仍然无法正常工作。但是,它现在可以正常工作,从那一刻起,您需要向您的用户帐户授予 REFERENCES 权限。

请参阅 MySQL 5.5 文档:Table 13.3 - Permissible Privileges for GRANT and REVOKE

REFERENCES 启用外键创建。级别:全球、数据库、 表、列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-05
    • 2019-12-25
    • 2020-07-26
    • 1970-01-01
    • 2021-01-22
    • 2012-04-07
    • 1970-01-01
    相关资源
    最近更新 更多