文章
姚 鑫 · 十月 17 阅读大约需 7 分钟

第四十八章 SQL命令 GRANT(二)

第四十八章 SQL命令 GRANT(二)

GRANT COLUMN-权限

列权限授予用户或角色对指定表或视图上的指定列列表的指定权限。这允许访问某些表列,而不允许访问同一表的其他列。这提供了比GRANT OBJECT-PRIVICATION选项更具体的访问控制,后者定义了整个表或视图的权限。向被授权者授予权限时,应为表授予表级权限或列级权限,但不能同时授予两者。SELECTINSERTUPDATEREFERENCES权限可用于授予对单个列中数据的访问权限。

对具有GRANT OPTION的表具有SELECTINSERTUPDATEREFERENCES对象权限的用户可以向其他用户授予该表的列的相同类型的列权限。

可以指定单个列,也可以指定逗号分隔的列列表。列列表必须用括号括起来。列名可以按任意顺序指定,允许重复。将COLUMN特权授予已具有该特权的列不起作用。

以下示例授予两列的UPDATE权限:

GRANT UPDATE(Name,FavoriteColors) ON Sample.Person TO Deborah

可以授予表或视图的列特权。可以向任何类型的被授权者授予列权限,包括用户列表、角色列表、*_PUBLIC。但是,不能将星号(*)通配符用于权限、字段名或表名。

如果用户将新记录插入到表中,则只会将数据插入到已授予列权限的那些字段中。所有其他数据列都设置为定义的列默认值,如果没有定义的默认值,则设置为NULL。不能向RowIDIDENTITY列授予列级INSERTUPDATE权限。插入时, SQL会自动提供RowID和标识列值(如果需要)。

列级权限可以通过SQL GRANTREVOKE命令或通过 IRIS System Security授予或撤消。转到管理门户,依次选择System Administration、Security、Users(或System Administration、Security、Roles),选择所需用户或角色的名称,然后选择SQL Tables或SQL Views选项卡。从下拉列表中选择所需的命名空间。然后选择Add Columns按钮。在显示的窗口中,选择一个方案,选择一个表,选择一个或多个列,然后分配权限。

授予多个权限

可以使用单个GRANT语句指定以下权限组合:
- 一个或多个角色。
- 一个或多个表级权限和一个或多个列级权限。要指定多个表级和列级权限,该权限必须紧跟在列列表之前才能授予列级权限。否则,它将授予表级特权。
- 一个或多个管理员权限。不能在同一GRANT语句中包含管理员权限和角色名称或对象权限。尝试这样做会导致SQLCODE-1错误。

以下示例授予Deborah表级SELECTUPDATE权限以及列级INSERT权限:

GRANT SELECT,UPDATE,INSERT(Name,FavoriteColors) ON Sample.Person TO Deborah

以下示例授予Deborah列级SELECTINSERTUPDATE权限:

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关键字子句与对象权限或列权限一起使用。带CASCADEREVOKE命令可用于撤消这一系列级联授予的权限。

例如,可以使用以下命令向用户授予对Employees表的Chris %ALTERSELECTINSERT权限:

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授予用户对模式SAMPLESELECT权限。
  • 用户A可以向用户B授予对模式SAMPLESELECT权限。
  • 用户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特权只能通过ODBCJDBC和动态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 *)
00
1 0 0 6
Log in or sign up to continue