时间:2022-11-07 10:30:01 | 来源:信息时代
时间:2022-11-07 10:30:01 来源:信息时代
SQL访问控制 : SQL标准对SQL数据提供的安全保护机制。它采用的基本安全模型如下: 每个SQL会话的上下文中包含一个授权栈,栈中的每个单元由用户标识符或角色名或两者组成。栈顶单元中的用户标识符称为当前用户标识符,角色名称为当前角色名。当前用户标识符和当前角色名的可应用特权的并集为当前特权,它决定当前SQL语句的执行权限。SQL会话初始化时,授权栈中只包含一个用户标识符,称为SQL会话用户标识符。当在SQL会话期间调用外部调用过程、SQL调用例程、触发器动作、准备语句或直接执行语句(假设为E)时,栈顶单元的拷贝被压入授权栈,而栈顶单元的内容则被E的属主的授权标识符所取代。E执行结束时,栈顶单元被删除。
基于上述安全模型,SQL标准在其子条款说明中都规定了访问规则,即执行该动作所需要的权限。同时还提供了一系列访问控制语句,包括角色的定义及撤销语句和特权的授予及回收语句。
角色是SQL99中新增的数据库对象。在SQL99以后的SQL标准中,授权标识符既可以是一个用户,也可以是一个角色。增加角色对象的原因在于,一个大机构内可能有许多对相同对象具有相同特权的用户,如果对每个这样的用户分别授予这些对象上的特权,则会导致授权关系复杂,维护困难,而通过角色则可以简化上述问题。角色是一个命名的特权集,它可以被授权给一个授权标识符,从而允许该授权标识符使用此角色的所有特权。用户和角色之间有多对多的联系: 一个用户允许被授权多个角色,同一角色也可被授权给多个用户。一个角色也可被授权给其他角色,但不允许角色循环授权。角色的创建和撤销通过角色定义语句和撤销角色语句来实现。如:
CREATE ROLE ROLE_1
WITH ADMIN CURRENT_USER;
该语句创建一个名为ROLE 1的角色,并将此角色自动授权给当前用户。又如:
DROP ROLE ROLE_1;
该语句撤销角色ROLE_1,同时对被授予该角色的每个授权标识符回收该角色的使用权。
特权的授予和回收是SQL访问控制的核心功能。它使得授权标识符可以自主地将自己拥有的特权授权给其他授权标识符,或者从其他授权标识符回收特权。特权允许一个授权标识符在给定的基表、视图、列、域、字符集、排序、翻译、用户定义类型、触发器、SQL调用例程或序列发生器上执行特定的动作。特权由特权描述符定义,特权描述符包括:
(1)特权执行对象的标识。
(2)特权授予者的授权标识符。
(3)特权接受者的授权标识符。
(4)特权允许的动作。
(5)特权对于特权接受者是否是可授予的。
(6) 特权是否指定了 WITH HIERARCHY OPTION。
不同对象类型上可执行的动作是不同的。例如:表上可执行的动作有INSERT、UPDATE、DELETE、SELECT、TRIGGER和REFERENCES;SQL调用例程上可执行的动作只能是EXECUTE。
SQL标准提供授权语句来实现特权的授予。授权语句分为授权特权语句和授权角色语句。前者是将给定对象上的一个或多个特权授权给接受者;后者是将一个或多个角色授权给接受者。如:
GRANT SELECT ON TAB_1 TO ROLE_1
WITH GRANT OPTION;
该语句将表TAB 1上的SELECT特权授给授权标识符ROLE 1,并允许ROLE 1将此特权转授给别的接受者。又如:
GRANT ROLE_1 TO PUBLIC;
该语句将角色ROLE_1授权给SQL环境中的所有授权标识符。此后,如果角色ROLE 1拥有的特权发生了变化(如被授予了新的特权),则被授予此角色的所有授权标识符的特权也将相应地变化。
回收语句用于回收特权。回收语句的语法与授权语句对应,也分为回收特权语句和回收角色语句两种形式。如:
REVOKE SELECT ON TAB_1
FROM ROLE_1;
该语句回收角色ROLE_1在TAB_1上的SELECT特权。又如:
REVOKE ROLE_1 FROM PUBLIC;
该语句回收SQL环境中所有授权标识符对于角色ROLE_1的使用权。