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