第四十八章 SQL命令 GRANT(二)
GRANT COLUMN-权限
列权限授予用户或角色对指定表或视图上的指定列列表的指定权限。这允许访问某些表列,而不允许访问同一表的其他列。这提供了比GRANT OBJECT-PRIVICATION
选项更具体的访问控制,后者定义了整个表或视图的权限。向被授权者授予权限时,应为表授予表级权限或列级权限,但不能同时授予两者。SELECT
、INSERT
、UPDATE
和REFERENCES
权限可用于授予对单个列中数据的访问权限。
对具有GRANT OPTION
的表具有SELECT
、INSERT
、UPDATE
或REFERENCES
对象权限的用户可以向其他用户授予该表的列的相同类型的列权限。
可以指定单个列,也可以指定逗号分隔的列列表。列列表必须用括号括起来。列名可以按任意顺序指定,允许重复。将COLUMN
特权授予已具有该特权的列不起作用。
以下示例授予两列的UPDATE权限:
GRANT UPDATE(Name,FavoriteColors) ON Sample.Person TO Deborah
可以授予表或视图的列特权。可以向任何类型的被授权者授予列权限,包括用户列表、角色列表、*
和_PUBLIC
。但是,不能将星号(*
)通配符用于权限、字段名或表名。
如果用户将新记录插入到表中,则只会将数据插入到已授予列权限的那些字段中。所有其他数据列都设置为定义的列默认值,如果没有定义的默认值,则设置为NULL
。不能向RowID
和IDENTITY
列授予列级INSERT
或UPDATE
权限。插入时, SQL会自动提供RowID
和标识列值(如果需要)。
列级权限可以通过SQL GRANT
和REVOKE
命令或通过 IRIS System Security授予或撤消。转到管理门户,依次选择System Administration、Security、Users(或System Administration、Security、Roles),选择所需用户或角色的名称,然后选择SQL Tables或SQL Views选项卡。从下拉列表中选择所需的命名空间。然后选择Add Columns按钮。在显示的窗口中,选择一个方案,选择一个表,选择一个或多个列,然后分配权限。
授予多个权限
可以使用单个GRANT
语句指定以下权限组合:
- 一个或多个角色。
- 一个或多个表级权限和一个或多个列级权限。要指定多个表级和列级权限,该权限必须紧跟在列列表之前才能授予列级权限。否则,它将授予表级特权。
- 一个或多个管理员权限。不能在同一
GRANT
语句中包含管理员权限和角色名称或对象权限。尝试这样做会导致SQLCODE-1
错误。
以下示例授予Deborah
表级SELECT
和UPDATE
权限以及列级INSERT
权限:
GRANT SELECT,UPDATE,INSERT(Name,FavoriteColors) ON Sample.Person TO Deborah
以下示例授予Deborah
列级SELECT
、INSERT
和UPDATE
权限:
GRANT SELECT(Name,FavoriteColors),INSERT(Name,FavoriteColors),UPDATE(FavoriteColors) ON Sample.Person TO Deborah
WITH GRANT OPTION子句
对象的所有者自动拥有该对象的所有权限。GRANT
语句的TO
子句指定要向其授予访问权限的用户或角色。在使用TO
选项指定被授权者之后,可以选择指定WITH GRANT OPTION
关键字子句,以允许被授权者也能够将相同的权限授予其他用户。可以将WITH GRANT OPTION
关键字子句与对象权限或列权限一起使用。带CASCADE
的REVOKE
命令可用于撤消这一系列级联授予的权限。
例如,可以使用以下命令向用户授予对Employees
表的Chris
%ALTER
、SELECT
和INSERT
权限:
GRANT %ALTER, SELECT, INSERT
ON EMPLOYEES
TO Chris
为了使Chris
也能够将这些权限授予其他用户,GRANT
命令包含WITH GRANT OPTION
子句:
GRANT %ALTER, SELECT, INSERT
ON EMPLOYEES
TO Chris WITH GRANT OPTION
可以使用%SQLCatalogPriv.SQLUsers()
方法调用来查找GRANT
语句的结果。
使用GRANT OPTION
向模式授予权限允许被授权者能够将相同的模式权限授予其他用户。但是,它不允许被授权者授予该架构中指定对象的特权,除非用户已被显式授予该特定对象的特权(GRANT OPTION
)。下面的示例显示了这一点:
- 用户
A
和用户B
在没有权限的情况下启动。 - 使用
GRANT OPTION
授予用户对模式SAMPLE
的SELECT
权限。 - 用户
A
可以向用户B
授予对模式SAMPLE
的SELECT
权限。 - 用户
A
无法将表Sample.Person的SELECT
权限授予用户B。
WITH ADMIN OPTION子句
WITH ADMIN OPTION
子句授予被授权者将其收到的相同权限授予其他人的权利。要授予系统权限,必须已被授予具有ADMIN
选项的系统权限。
可以授予一个角色,如果这个角色已经通过ADMIN OPTION
授予给,或者如果拥有%Admin_Secure:"U"
资源。
授予WITH ADMIN OPTION
将取代先前没有此选项的相同权限的授予。
因此,如果在没有WITH ADMIN OPTION
的情况下授予一个用户特权,然后再将相同的特权授予WITH ADMIN OPTION
用户,那么该用户就拥有WITH ADMIN OPTION
权限。
但是,没有WITH ADMIN OPTION
的授予不会取代之前使用该选项授予的相同权限。
要从特权中删除WITH ADMIN OPTION
权限,必须撤销该特权,然后在不使用此条款的情况下重新授予该特权。
导出权限
可以使用$SYSTEM.SQL.Schema.ExportDDL()
方法导出特权。
在此方法中指定表时, IRIS将导出为该表授予的所有表级特权和所有列级特权。
IRIS安全
在嵌入式SQL中使用GRANT
之前,需要以具有适当特权的用户身份登录。
如果不这样做,将导致SQLCODE -99
错误(特权冲突)。
使用$SYSTEM.Security.Login()
方法为用户分配适当的权限:
DO $SYSTEM.Security.Login("_SYSTEM","SYS")
&sql( )
必须具有%Service_Login:Use
权限才能调用$SYSTEM.Security
。
登录方法。
执行权限
SQL特权只能通过ODBC
、JDBC
和动态SQL (%SQL. statement
)强制执行。
在系统范围内执行特权取决于$SYSTEM.SQL.Util.SetOption("SQLSecurity")
方法调用的设置。
要确定当前设置,调用$SYSTEM.SQL.CurrentSettings()
,它会显示一个SQL Security ON: setting
。
默认值是1 (Yes
):用户只能对已被授予权限的表和视图执行操作。
这是该选项的推荐设置。
如果此选项设置为0 (No
),则更改此设置后启动的任何新进程将禁用SQL Security。
这意味着禁止基于特权的表/视图安全性。
您可以在不指定用户的情况下创建表。
在本例中,管理门户将“_SYSTEM
”分配为user
,嵌入式SQL将“”
(空字符串)分配为user
。
任何用户都可以对表或视图执行操作,即使该用户没有这样做的特权。
示例
下面的示例创建用户、创建角色,然后将角色分配给用户。
如果用户或角色已经存在,则发出SQLCODE -118
错误。
如果已经完成了特权或角色的分配,则不会发出错误(SQLCODE = 0
)。
ClassMethod Grant1()
{
d $SYSTEM.Security.Login("_SYSTEM","SYS")
CreateUser
s x = $SYSTEM.SQL.UserExists("MarthaTest")
if x = 0 {
&sql(
CREATE USER MarthaTest IDENTIFY BY birdpw
)
if SQLCODE '= 0 {
w "创建用户 error: ",SQLCODE,!
q
}
} else {
w "用户MarthaTest已存在,但未更改其角色",!
q
}
CreateRoleAndGrant
&sql(
CREATE ROLE workerbee
)
w !,"创建角色错误代码: ",SQLCODE
&sql(
GRANT %CREATE_TABLE TO workerbee
)
w !,"授予权限错误码: ",SQLCODE
&sql(
GRANT workerbee TO MarthaTest
)
w !,"授予角色错误码: ",SQLCODE
}
下面的示例显示了多个特权的分配。
它创建一个用户和两个角色。
一个GRANT
语句将这些角色和一组admin
权限分配给用户。
如果用户或角色已经存在,则发出SQLCODE -118
错误。
如果已经完成了特权或角色的分配,则不会发出错误(SQLCODE = 0
)。
ClassMethod Grant2()
{
d $SYSTEM.Security.Login("_SYSTEM","SYS")
CreateUser
s x = $SYSTEM.SQL.UserExists("NoahTest")
if x = 0 {
&sql(CREATE USER NoahTest IDENTIFY BY birdpw)
if SQLCODE '= 0 {
w "创建用户 error: ",SQLCODE,!
q
}
} else {
w "用户NoahTest已存在,但未更改其角色",!
q
}
Create2RolesAndGrant
&sql(CREATE ROLE workerbee)
w !,"CREATE ROLE 1 error code: ",SQLCODE
&sql(CREATE ROLE drone)
w !,"CREATE ROLE 2 error code: ",SQLCODE
&sql(GRANT workerbee,drone,%CREATE_TABLE,%DROP_TABLE TO NoahTest)
w !,"GRANT角色和权限错误代码: ",SQLCODE
}
下面的示例将当前命名空间中所有表上的所有7个基本权限授予所有当前定义的没有%all
角色的用户:
DO $SYSTEM.Security.Login("_SYSTEM","SYS")
&sql(GRANT * ON * TO *)
网友评论