为什么需要“引用”权限?

时间:2014-03-01 04:56:28

标签: sql mariadb

为了创建FOREIGN KEY约束,拥有引用表的<AuthorizationID>必须是当前<AuthorizationID>,并且必须在每个引用的列上具有REFERENCES权限。资料来源:https://mariadb.com/kb/en/constraint_type-foreign-key-constraint/

为什么?

1 个答案:

答案 0 :(得分:0)

引用权限的原因是引用另一个表的表对另一个表施加约束,而该另一个表的所有者可能不愿意允许该约束。

让我们看看如果没有参考权限会发生什么。

CREATE TABLE Employees
(
    EmpID   INTEGER NOT NULL PRIMARY KEY,
    Name    VARCHAR(32) NOT NULL,
    …
);

INSERT INTO Employees VALUES (1, "Hernandez", …);

现在,乔又创造了一张桌子:

CREATE TABLE EmployeeRefs
(
    EmpID INTEGER NOT NULL PRIMARY KEY REFERENCES Employees
);

INSERT INTO EmployeeRefs SELECT EmpID FROM Employees;

现在假设人力资源部门需要让Hernandez去其他地方工作,而且代码知道相关的EmpID是1:

DELETE FROM Employees WHERE EmpID = 1;

此删除失败;仍然从EmployeeRefs表中引用主键值。

就DBMS而言,这是应该发生的事情。有人告诉我们,EmployeeRefs.EmpID列中的值必须与Employee.EmpID列中的值匹配,如果它删除了Hernandez的记录,那么它不会成立,所以它必须阻止删除(因为Joe没有设置级联删除。)

显然,如果任何用户(具有在数据库中创建表的权限)可以阻止人力资源部门开展工作,则存在问题。通过说Joe只有在获得REFERENCES权限的情况下才能创建对Employee表的引用来解决问题。并且每个表的所有者/创建者可以选择对他们创建的表具有REFERENCES特权的人。