Sql 为什么是“a”;参考资料;需要特权吗?

Sql 为什么是“a”;参考资料;需要特权吗?,sql,mariadb,Sql,Mariadb,为了创建外键约束, 为什么?引用权限的原因是引用另一个表的表对另一个表施加了约束,而该另一个表的所有者可能不愿意允许该约束 让我们看看如果没有引用特权会发生什么 CREATE TABLE Employees ( EmpID INTEGER NOT NULL PRIMARY KEY, Name VARCHAR(32) NOT NULL, … ); INSERT INTO Employees VALUES (1, "Hernandez", …); 现在Joe来了

为了创建外键约束,


为什么?

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

让我们看看如果没有引用特权会发生什么

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

INSERT INTO Employees VALUES (1, "Hernandez", …);
现在Joe来了,创建了一个表:

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表的引用。每个表的所有者/创建者可以选择谁对他们创建的表具有引用权限。

@StuartLC:SQL标准在语法中使用了
(例如
就是
)。这个问题通常适用于SQL DBMS,尽管它是用MariaDB(MySQL的一个衍生物)表达的。