第四十七章 SQL命令 GRANT(一)

2021-10-17  本文已影响0人  Cache技术分享

第四十七章 SQL命令 GRANT(一)

向用户或角色授予特权。

大纲

GRANT admin-privilege TO grantee [WITH ADMIN OPTION]

GRANT role TO grantee [WITH ADMIN OPTION] 

GRANT object-privilege ON object-list TO grantee [WITH GRANT OPTION]

GRANT SELECT ON CUBE[S] object-list TO grantee [WITH GRANT OPTION]

GRANT column-privilege (column-list) ON table TO grantee  [WITH GRANT OPTION]  

参数

描述

GRANT命令将对指定的表、视图、列或其他实体执行指定任务的权限授予一个或多个指定的用户或角色。
可以进行以下基本操作:

如果为某个用户赋予特权,则该用户可以立即行使该特权。
如果为角色授予权限,则已被授予该角色的用户可以立即使用该权限。
如果取消特权,用户将立即失去该特权。
一个用户实际上只被授予一次特权。
多个用户可以多次授予一个用户相同的权限,但单个REVOKE会删除该权限。

特权是基于每个名称空间授予的。

SQL特权只能通过ODBCJDBC和动态SQL (%SQL. statement)强制执行。

因为GRANT准备和执行非常快,而且通常只运行一次,所以 IRIS不会在ODBCJDBC或动态SQL中为GRANT创建缓存查询。
执行GRANT命令时,会执行*的扩展。

GRANT admin-privilege

SQL管理(admin)权限适用于用户或角色。
任何没有绑定到任何特定对象的特权(因此是该用户或角色的一般权限)都被认为是管理特权。
这些特权是根据当前名称空间的每个名称空间授予的。

%DB_OBJECT_DEFINITION权限授予所有16个数据定义权限。
它没有授予%BUILD_INDEX%NOCHECK%NOINDEX%NOLOCK%NOTRIGGER权限,这些权限必须显式授予。

%BUILD_INDEX特权授予使用BUILD INDEX命令。
%NOCHECK%NOINDEX%NOLOCK%NOTRIGGER权限授予在INSERTUPDATEINSERT OR UPDATEDELETE语句的约束子句中使用这些选项。
它们对使用%NOINDEX关键字作为谓词条件的前言没有影响。
因为TRUNCATE TABLE执行删除具有%NOTRIGGER行为的表中的所有行,所以必须拥有%NOTRIGGER权限才能运行TRUNCATE TABLE
在准备INSERTUPDATEINSERT or UPDATEDELETE语句时,必须具有适当的%NOCHECK%NOINDEX%NOLOCK%NOTRIGGER权限才能使用该限制。

如果指定的管理特权不是有效的特权名称(例如,由于拼写错误), IRIS将成功完成,并发出SQLCODE 100(到达数据末尾);
IRIS不检查指定的用户(或角色)是否存在。
如果指定的管理权限有效,但指定的用户(或角色)不存在, IRIS将发出SQLCODE -118错误。

GRANT role

这种形式的GRANT将用户分配给指定的角色。
还可以将一个角色分配给另一个角色。
如果接收分配的指定角色不存在 IRIS将发出SQLCODE 100(到达数据末尾)。
如果分配给角色的指定用户(或角色)不存在 IRIS将发出SQLCODE -118错误。
如果不是超级用户,并且正在尝试授予一个不拥有且没有ADMIN OPTION的角色, IRIS将发出SQLCODE -112错误。

使用CREATE ROLE语句创建角色。
如果角色名是分隔的标识符,则在分配时必须将其括在引号中。

角色可以通过SQL GRANTREVOKE命令授予或撤销,也可以通 IRIS System Security:

GRANT object-privilege

对象特权赋予用户或角色对特定对象的某些权限。
将对象列表上的对象特权授予被授予者。
对象列表可以在当前名称空间中指定一个或多个表、视图、存储过程或多维数据集。
通过使用逗号分隔的列表,单个GRANT语句可以将多个对象上的多个对象特权授予多个用户和/或角色。

以下是可用的对象特权值:

可以使用星号(*)通配符作为对象列表值,将对象特权授予当前命名空间中的所有对象。
例如,GRANT SELECT ON * TO Deborah授予该用户对所有表和视图的SELECT权限。
GRANT EXECUTE ON * TO Deborah授予该用户对所有非隐藏存储过程的EXECUTE权限。

可以使用SCHEMA SCHEMA -name作为对象列表值,将对象特权授予当前命名空间中命名模式中的所有表、视图和存储过程。
例如,GRANT SELECT ON SCHEMA Sample TO Deborah为该用户授予Sample模式中所有对象的SELECT权限。
这包括将来将在该模式中定义的所有对象。
可以将多个模式指定为逗号分隔的列表;
例如,GRANT SELECT ON SCHEMA Sample,Cinema TO Deborah授予SampleCinema模式中所有对象的SELECT权限。

多维数据集是不受模式名称限制的SQL标识符。
要指定多维数据集对象列表,必须指定CUBE(或cubes)关键字。
只能向多维数据集授予SELECT权限。

下面的示例演示了如何为特定表的特定用户授予SELECTUPDATE权限:

ClassMethod Grant()
{
    d $SYSTEM.Security.Login("_SYSTEM","SYS")
CreateUser
    s x = $SYSTEM.SQL.UserExists("DeborahTest")
    if x = 0 {
        &sql(
            CREATE USER DeborahTest IDENTIFY BY birdpw
        )
        if SQLCODE '= 0 {
            WRITE "创建用户错误: ",SQLCODE,!
            q
        }
    } else {
        w "用户DeborahTest已经存在,没有更改权限",!
        q 
    }
GrantPrivsToUser
    &sql(
        GRANT SELECT,UPDATE ON SQLUSER.T1 TO DeborahTest
    )
    w !,"GRANT 错误代码: ",SQLCODE
DropUser
    &sql(
        DROP USER DeborahTest
    )
    if SQLCODE '= 0 {
        w "DROP USER error: ",SQLCODE,!
    }
}

权限只能显式授予已经存在的表、视图或存储过程。
如果指定的对象不存在,IRIS将发出SQLCODE -30错误。
但是,可以向一个模式授予特权,该模式将特权授予该模式中所有现有的对象,以及在授予特权时该模式中不存在的所有未来对象。

如果表的所有者是_PUBLIC,则用户访问表不需要被授予对象权限。

如果指定的用户不存在, IRIS将发出SQLCODE -118错误。
如果已经授予了指定的对象特权, IRIS将发出SQLCODE 100(到达数据末尾)。

对象权限可以通过以下方式授予或撤销:

可以通过调用%CHECKPRIV命令来确定当前用户是否具有指定的对象权限。可以通过调用$SYSTEM.SQL.Security.CheckPrivileve()方法来确定指定用户是否具有指定的表级对象权限,如下例所示:

   WRITE "SELECT privilege? ",$SYSTEM.SQL.Security.CheckPrivilege("DeborahTest","1,SQLUSER.TestT1","s"),!
   WRITE "UPDATE privilege? ",$SYSTEM.SQL.Security.CheckPrivilege("DeborahTest","1,SQLUSER.TestT1","u"),!
   WRITE "DELETE privilege? ",$SYSTEM.SQL.Security.CheckPrivilege("DeborahTest","1,SQLUSER.TestT1","d"),!

对象所有者权限

表、视图或过程的所有者始终隐式拥有SQL对象的所有SQL特权。该对象的所有者在该对象映射到的所有名称空间中拥有该对象的特权。

上一篇 下一篇

猜你喜欢

热点阅读