分类:
2008-05-17 17:21:21
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
数据库和对象特权 db2数据库特权大体上分成两类:数据库级特权(针对数据库中的所有对象)和对象级特权(与特定的对象相关联)。 用户可以拥有的数据库级特权有:
数据库对象 包括表、视图、索引、模式和包。幸运的是,大多数对象级特权的意义无需解释。下表总结了这些特权。
关于对象级特权的信息存储在系统编目视图中。视图名称是 syscat.tabauth、syscat.colauth、syscat.indexauth、syscat.schemaauth、syscat.routineauth 和 syscat.packageauth。 显式特权 可以使用 GRANT 和 REVOKE 命令显式地 对用户或组授予或撤消特权。我们来看看如何在各种对象上使用这些命令。 作为拥有 Administrator 权限的用户登录 Windows,打开两个 DB2 命令窗口。在这两个窗口中,确保将 db2instance 变量设置为 DB2! 在第一个窗口中发出以下命»: 现在,在第二个窗口中发出以下命令: 请记住,第一个窗口中的命令是由一个拥有 SYSADM 权限的用户发出的。第二个窗口中的命令是由 tst1 发出的,这个用户对示例数据库没有特殊的权限或特权。注意,与示例数据库中的表相关联的模式名是发出 db2sampl 命令的用户的名称。在这些示例中,这个用户是 GMILNE。 现在,在第二个窗口中发出以下命令: db2 select * from gmilne.org 应该会看到以下: 为了纠正这种状况,在第一个窗口中发出以下命令: 现在,前面的命令就会成功!接下来,在第二个窗口中发出一个更复杂的命令: 同样会看到错误消息: SQL0551N "TEST1" does not have the privilege to perform operation "INSERT" on object "GMILNE.ORG" 所以,在第一个窗口中输入以下命令: db2 grant insert on table gmilne.org to group db2grp1 原来失败的 INSERT 命令现在应该会成功完成,因为 test1 是 db2grp1 组的成员。 现在,在第二个窗口中输入以下命令: db2 drop table gmilne.emp_photo 同样会看到错误消息: SQL0551N "TEST1" does not have the privilege to perform operation "DROP TABLE" 所以,我们要授予这个特权。在第一个窗口中输入以下命令: DROP TABLE 命令现在应该会成功完成。 既然已经完成了示例,就可以撤消刚才授予的特权。在第一个窗口中发出以下命令: db2 revoke insert on table gmilne.org from group db2grp1 db2 revoke dropin on schema gmilne from all 注意,从组中撤消特权不一定会从这个组的所有成员撤消它。例如,以下命令可以用来从 db2grp1 撤消对 gmilne.org 表的所有特权(CONTROL 除外): db2 revoke all on table gmilne.org from group db2grp1 但是,test1 用户(他是 db2grp1 的成员)仍然拥有对这个表的选择特权,因为他或她是被直接授予这个特权的。 隐式特权 当发出某些命令时,DB2 可能会自动地授予特权,而不需要像前面看到的那样发出显式的 GRANT 语句。下表总结了会导致数据库管理程序隐式地授予特权的一些命令。注意,当删除创建的对象时,这些特性会隐式地撤消。但是,当显式地撤消更高级的特权时,不会撤消它们。
*当用户创建数据库时,隐式地授予这个用户这个数据库上的 DBADM 权限。获得 DBADM 权限就会隐式地授予 CONNECT、CREATETAB、BINDADD、IMPLICIT_SCHEMA 和 CREATE_NOT_FENCED 特权。即使撤消了 DBADM 权限,这个用户仍然会保留这些特权。 **PUBLIC 是一个特殊的 DB2 组,其中包括特定数据库的所有用户。与前面讨论过的其他组不同,PUBLIC 不必在系统级进行定义。在默认情况下,会向 PUBLIC 授予一些特权。例如,这个组自动接受数据库上的 CONNECT 特权和编目表上的 SELECT 特权。可以对 PUBLIC 组发出 GRANT 和 REVOKE 命令,比如: db2 grant select on table sysibm.systables to public db2 revoke select on table sysibm.systables from public 间接特权 当数据库管理器执行包 时,可以间接获得特权。包中包含一个或多个 SQL 语句,这些语句已经为 DB2 用来在内部执行它们的格式。换句话说,包中包含可执行格式的多个 SQL 语句。如果包中的所有语句都是静态的,那么用户只需要有包上的 EXECUTE 特权,就能够成功地执行包中的语句。 例如,假设 db2package1 执行以下静态的 SQL 语句: db2 select * from org db2 insert into test values (1, 2, 3) 在这种情况下,拥有 db2package1 上的 EXECUTE 特权的用户会间接地获得 org 表上的 SELECT 特权和 test 表上的 INSERT 特权。 基于标签的访问控制 DB2 9 中新增的一个概念是基于标签的访问控制(LBAC)。LBAC 为 DBA 提供了在表的行或列级限制读/写特权的能力。 在以前,进行这种限制的惟一是创建一个视图,授权用户使用这个视图,并撤消对基表的访问权。 本教程只演示 LBAC 场景的一个示例。关于 LBAC 的更详细解释,请 developerWorks 上的 DB2 Label-Based Access Control, a practical guide, Part 1: Understand the basics of LBAC in DB2。 LBAC 由安全管理员 通过创建安全策略来设置。每个表只能由一个安全策略来控制,但是系统中可以有任意数量的安全策略。设置 LBAC 需要几个步骤。必须做的第一件事情是,决定对于您的数据需要什么类型的访问控制。 我们做出以下假设。在您的组织中有三类人。
现在,在组织的数据库中有一个定义职员信息的表。这个表类似于 SAMPLE 数据库中的 EMP 表。它包含关于职员和他们所属的部门的数据。它现在的定义如下: db2 => describe select * from emp SQLDA Information sqldaid : SQLDA sqldabc: 896 sqln: 20 sqld: 14 Column Information sqltype sqllen sqlname.data sqlname.length -------------------- ------ ------------------------------ -------------- 452 CHARACTER 6 EMPNO 5 448 VARCHAR 12 FIRSTNME 8 453 CHARACTER 1 MIDINIT 7 448 VARCHAR 15 LASTNAME 8 453 CHARACTER 3 WORKDEPT 8 453 CHARACTER 4 PHONENO 7 385 DATE 10 HIREDATE 8 453 CHARACTER 8 JOB 3 500 SMALLINT 2 EDLEVEL 7 453 CHARACTER 1 SEX 3 385 DATE 10 BIRTHDATE 9 485 DECIMAL 9, 2 SALARY 6 485 DECIMAL 9, 2 BONUS 5 485 DECIMAL 9, 2 COMM 4 组织会定期对规则进行审计。审计指出,职员不应该能够访问机密的数据。规则规定,执行官对所有职员记录有完全的读/写访问权,经理对自己部门的职员记录有读/写访问权,而主管只能读取部门中他们领导的职员的记录。 我们要设置 LBAC 安全策略来实现这些规则。 1、定义安全策略和标签,并将安全标签授予用户 2、在 EMP 表中添加安全标签列并将安全策略连接到它 定义安全策略和标签 为了定义安全策略和标签,需要 SECADM 权限。 步骤 1a. 创建安全标签组件 首先,需要决定对于这个策略最合适的安全组件类型。在这个示例中,最合适的策略类型是 “TREE”。Tree 策略意味着可以定义一组标签,让子组件拥有它们的父组件的权限的子集。在这个示例中,创建一个名为 “J_DEPT” 的安全组件。 CREATE SECURITY LABEL COMPONENT J_DEPT TREE ('HR_EXECUTIVE' ROOT, 'MAN_D11_E21' UNDER 'HR_EXECUTIVE' 'A00' UNDER 'HR_EXECUTIVE', 'B01' UNDER 'HR_EXECUTIVE', 'C01' UNDER 'HR_EXECUTIVE', 'D11' UNDER 'MAN_D11_E21', 'D21' UNDER 'HR_EXECUTIVE', 'E01' UNDER 'HR_EXECUTIVE', 'E11' UNDER 'HR_EXECUTIVE', 'E21' UNDER 'MAN_D11_E21' ) 上面的布局说明根是 HR_EXECUTIVE,这个执行官领导的所有部门都是它的子组件。 步骤 1b. 定义安全策略 在上面的示例中,设置 LBAC 所需的下一个步骤是定义与上面的安全标签组件相关联的策略。一个安全策略可以使用多个组件。 CREATE SECURITY POLICY J_DEPT_POLICY COMPONENTS J_DEPT WITH DB2LBACRULES RESTRICT NOT AUTHORIZED WRITE SECURITY LABEL 步骤 1c. 创建安全标签 设置安全策略的第三步是创建安全标签。在这里将指定每个用户具有的不同角色。因为这个示例非常简单,只有三个标签,Executive、Manager 和 Team Lead。 CREATE SECURITY LABEL J_DEPT_POLICY.EXECUTIVE COMPONENT J_DEPT 'HR_EXECUTIVE' CREATE SECURITY LABEL J_DEPT_POLICY.MANAGE_D11_E21 COMPONENT J_DEPT 'MAN_D11_E21' CREATE SECURITY LABEL J_DEPT_POLICY.A00 COMPONENT J_DEPT 'A00' CREATE SECURITY LABEL J_DEPT_POLICY.B01 COMPONENT J_DEPT 'B01' CREATE SECURITY LABEL J_DEPT_POLICY.C01 COMPONENT J_DEPT 'C01' CREATE SECURITY LABEL J_DEPT_POLICY.D11 COMPONENT J_DEPT 'D11' CREATE SECURITY LABEL J_DEPT_POLICY.D21 COMPONENT J_DEPT 'D21' CREATE SECURITY LABEL J_DEPT_POLICY.E01 COMPONENT J_DEPT 'E01' CREATE SECURITY LABEL J_DEPT_POLICY.E11 COMPONENT J_DEPT 'E11' CREATE SECURITY LABEL J_DEPT_POLICY.E21 COMPONENT J_DEPT 'E21' 在下一步中,将定义与这些标签相关联的实际权限。 步骤 1d. 根据标签授予权限 下面的步骤描述对表数据授予权限的过程。权限可以是 ALL ACCESS、WRITE ACCESS 或 READ ACCESS。如果这些权限都没有授予一个用户,那么这个用户就不能访问任何表数据。请记住,执行官有完全的访问权,经理对自己的部门有完全的访问权,而团队主管对他们领导的部门成员有读访问权。 db2 grant security label J_DEPT_POLICY.A00 to user Frank for read access db2 grant security label J_DEPT_POLICY.MANAGE_D11_E21 to user Joe for all access db2 grant security label J_DEPT_POLICY.EXECUTIVE to user Jane for all access 在用户上设置以上标签,就会根据步骤 1a 中的树定义来分配权限。因为用户 Joe 被标为 MANAGE_D11_E21 并获得所有权限,他将能够读写那些安全标记为 J_DEPT_POLICY.D11 或 J_DEPT_POLICY.E21 的行(因为它们是他的子组件)。 步骤 2. 修改 EMP 表 在修改 EMP 表时,必须创建一个额外的列来存储安全标签。这个列的类型是 “DB2SECURITYLABEL”。您可以修改 SAMPLE 数据库中现有的 EMP 表。为此,必须使用在这个策略中被授予根级特权的用户,在这个示例中就是用户 Jane。还必须先从 SAMPLE 数据库删除 MQT 表 ADEFUSR。 CONNECT TO SAMPLE Database Connection Information Database server = DB2/NT 9.1.0 SQL authorization ID = GMILNE Local database alias = SAMPLE DROP TABLE ADEFUSR CONNECT RESET CONNECT TO SAMPLE USER Jane USING password ALTER TABLE EMP ADD COLUMN DEPT_TAG DB2SECURITYLABEL ADD SECURITY POLICY J_DEPT_POLICY 如果从 EMP 表进行选择,就会看到刚定义的新列。因为是用在 EXECUTIVE 级上定义的用户执行这一修改,添加的所有安全标记都是 EXECUTIVE。为了改变这一情况,需要更新这个表。 db2 => select EMPNO, FIRSTNME, LASTNAME, WORKDEPT, SALARY, varchar(SECLABEL_TO_CHAR('J_DEPT_POLICY',DEPT_TAG),30) from gmilne.emp EMPNO FIRSTNME LASTNAME WORKDEPT SALARY 6 ------ ------------ --------------- -------- ----------- ------------------------------ 000010 CHRISTINE HAAS A00 152750.00 HR_EXECUTIVE 000020 MICHAEL THOMPSON B01 94250.00 HR_EXECUTIVE 000030 SALLY KWAN C01 98250.00 HR_EXECUTIVE 000050 JOHN GEYER E01 80175.00 HR_EXECUTIVE 000060 IRVING STERN D11 72250.00 HR_EXECUTIVE 000070 EVA PULASKI D21 96170.00 HR_EXECUTIVE 000090 EILEEN HENDERSON E11 89750.00 HR_EXECUTIVE 000100 THEODORE SPENSER E21 86150.00 HR_EXECUTIVE 000110 VINCENZO LUCCHESSI A00 66500.00 HR_EXECUTIVE 000120 SEAN O'CONNELL A00 49250.00 HR_EXECUTIVE 000130 DELORES QUINTANA C01 73800.00 HR_EXECUTIVE 000140 HEATHER NICHOLLS C01 68420.00 HR_EXECUTIVE 000150 BRUCE ADAMSON D11 55280.00 HR_EXECUTIVE 000160 ELIZABETH PIANKA D11 62250.00 HR_EXECUTIVE 000170 MASATOSHI YOSHIMURA D11 44680.00 HR_EXECUTIVE 000180 MARILYN SCOUTTEN D11 51340.00 HR_EXECUTIVE 000190 JAMES WALKER D11 50450.00 HR_EXECUTIVE 000200 DAVID BROWN D11 57740.00 HR_EXECUTIVE 000210 WILLIAM JONES D11 68270.00 HR_EXECUTIVE 000220 JENNIFER LUTZ D11 49840.00 HR_EXECUTIVE 000230 JAMES JEFFERSON D21 42180.00 HR_EXECUTIVE 000240 SALVATORE MARINO D21 48760.00 HR_EXECUTIVE 000250 DANIEL SMITH D21 49180.00 HR_EXECUTIVE 000260 SYBIL JOHNSON D21 47250.00 HR_EXECUTIVE 000270 MARIA PEREZ D21 37380.00 HR_EXECUTIVE 000280 ETHEL SCHNEIDER E11 36250.00 HR_EXECUTIVE 000290 JOHN PARKER E11 35340.00 HR_EXECUTIVE 000300 PHILIP SMITH E11 37750.00 HR_EXECUTIVE 000310 MAUDE SETRIGHT E11 35900.00 HR_EXECUTIVE 000320 RAMLAL MEHTA E21 39950.00 HR_EXECUTIVE 000330 WING LEE E21 45370.00 HR_EXECUTIVE 000340 JASON GOUNOT E21 43840.00 HR_EXECUTIVE 200010 DIAN HEMMINGER A00 46500.00 HR_EXECUTIVE 200120 GREG ORLANDO A00 39250.00 HR_EXECUTIVE 200140 KIM NATZ C01 68420.00 HR_EXECUTIVE 200170 KIYOSHI YAMAMOTO D11 64680.00 HR_EXECUTIVE 200220 REBA JOHN D11 69840.00 HR_EXECUTIVE 200240 ROBERT MONTEVERDE D21 37760.00 HR_EXECUTIVE 200280 EILEEN SCHWARTZ E11 46250.00 HR_EXECUTIVE 200310 MICHELLE SPRINGER E11 35900.00 HR_EXECUTIVE 200330 HELENA WONG E21 35370.00 HR_EXECUTIVE 200340 ROY ALONZO E21 31840.00 HR_EXECUTIVE 42 record(s) selected. update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','A00')) where WORKDEPT='A00' update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','B01')) where WORKDEPT='B01' update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','C01')) where WORKDEPT='C01' update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','D11')) where WORKDEPT='D11' update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','D21')) where WORKDEPT='D21' update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','E01')) where WORKDEPT='E01' update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','E11')) where WORKDEPT='E11' update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','E21')) where WORKDEPT='E21' db2 => select EMPNO, FIRSTNME, LASTNAME, WORKDEPT, SALARY, varchar(SECLABEL_TO_CHAR('J_DEPT_POLICY',DEPT_TAG),30) from emp EMPNO FIRSTNME LASTNAME WORKDEPT SALARY 6 ------ ------------ --------------- -------- ----------- ------------------------------ 000010 CHRISTINE HAAS A00 152750.00 A00 000020 MICHAEL THOMPSON B01 94250.00 B01 000030 SALLY KWAN C01 98250.00 C01 000050 JOHN GEYER E01 80175.00 E01 000060 IRVING STERN D11 72250.00 D11 000070 EVA PULASKI D21 96170.00 D21 000090 EILEEN HENDERSON E11 89750.00 E11 000100 THEODORE SPENSER E21 86150.00 E21 000110 VINCENZO LUCCHESSI A00 66500.00 A00 000120 SEAN O'CONNELL A00 49250.00 A00 000130 DELORES QUINTANA C01 73800.00 C01 000140 HEATHER NICHOLLS C01 68420.00 C01 000150 BRUCE ADAMSON D11 55280.00 D11 000160 ELIZABETH PIANKA D11 62250.00 D11 000170 MASATOSHI YOSHIMURA D11 44680.00 D11 000180 MARILYN SCOUTTEN D11 51340.00 D11 000190 JAMES WALKER D11 50450.00 D11 000200 DAVID BROWN D11 57740.00 D11 000210 WILLIAM JONES D11 68270.00 D11 000220 JENNIFER LUTZ D11 49840.00 D11 000230 JAMES JEFFERSON D21 42180.00 D21 000240 SALVATORE MARINO D21 48760.00 D21 000250 DANIEL SMITH D21 49180.00 D21 000260 SYBIL JOHNSON D21 47250.00 D21 000270 MARIA PEREZ D21 37380.00 D21 000280 ETHEL SCHNEIDER E11 36250.00 E11 000290 JOHN PARKER E11 35340.00 E11 000300 PHILIP SMITH E11 37750.00 E11 000310 MAUDE SETRIGHT E11 35900.00 E11 000320 RAMLAL MEHTA E21 39950.00 E21 000330 WING LEE E21 45370.00 E21 000340 JASON GOUNOT E21 43840.00 E21 200010 DIAN HEMMINGER A00 46500.00 A00 200120 GREG ORLANDO A00 39250.00 A00 200140 KIM NATZ C01 68420.00 C01 200170 KIYOSHI YAMAMOTO D11 64680.00 D11 200220 REBA JOHN D11 69840.00 D11 200240 ROBERT MONTEVERDE D21 37760.00 D21 200280 EILEEN SCHWARTZ E11 46250.00 E11 200310 MICHELLE SPRINGER E11 35900.00 E11 200330 HELENA WONG E21 35370.00 E21 200340 ROY ALONZO E21 31840.00 E21 42 record(s) selected. 在更新之后,我们来看看各个用户能够做什么。使用 Executive 用户 ID Jane 连接数据库。首先执行与前面一样的选择语句: db2 => select EMPNO, FIRSTNME, LASTNAME, WORKDEPT, SALARY, varchar(SECLABEL_TO_CHAR('J_DEPT_POLICY',DEPT_TAG),30) from gmilne.emp EMPNO FIRSTNME LASTNAME WORKDEPT SALARY 6 ------ ------------ --------------- -------- ----------- ------------------------------ 000010 CHRISTINE HAAS A00 152750.00 A00 000020 MICHAEL THOMPSON B01 94250.00 B01 000030 SALLY KWAN C01 98250.00 C01 000050 JOHN GEYER E01 80175.00 E01 000060 IRVING STERN D11 72250.00 D11 000070 EVA PULASKI D21 96170.00 D21 000090 EILEEN HENDERSON E11 89750.00 E11 000100 THEODORE SPENSER E21 86150.00 E21 000110 VINCENZO LUCCHESSI A00 66500.00 A00 000120 SEAN O'CONNELL A00 49250.00 A00 000130 DELORES QUINTANA C01 73800.00 C01 000140 HEATHER NICHOLLS C01 68420.00 C01 000150 BRUCE ADAMSON D11 55280.00 D11 000160 ELIZABETH PIANKA D11 62250.00 D11 000170 MASATOSHI YOSHIMURA D11 44680.00 D11 000180 MARILYN SCOUTTEN D11 51340.00 D11 000190 JAMES WALKER D11 50450.00 D11 000200 DAVID BROWN D11 57740.00 D11 000210 WILLIAM JONES D11 68270.00 D11 000220 JENNIFER LUTZ D11 49840.00 D11 000230 JAMES JEFFERSON D21 42180.00 D21 000240 SALVATORE MARINO D21 48760.00 D21 000250 DANIEL SMITH D21 49180.00 D21 000260 SYBIL JOHNSON D21 47250.00 D21 000270 MARIA PEREZ D21 37380.00 D21 000280 ETHEL SCHNEIDER E11 36250.00 E11 000290 JOHN PARKER E11 35340.00 E11 000300 PHILIP SMITH E11 37750.00 E11 000310 MAUDE SETRIGHT E11 35900.00 E11 000320 RAMLAL MEHTA E21 39950.00 E21 000330 WING LEE E21 45370.00 E21 000340 JASON GOUNOT E21 43840.00 E21 200010 DIAN HEMMINGER A00 46500.00 A00 200120 GREG ORLANDO A00 39250.00 A00 200140 KIM NATZ C01 68420.00 C01 200170 KIYOSHI YAMAMOTO D11 64680.00 D11 200220 REBA JOHN D11 69840.00 D11 200240 ROBERT MONTEVERDE D21 37760.00 D21 200280 EILEEN SCHWARTZ E11 46250.00 E11 200310 MICHELLE SPRINGER E11 35900.00 E11 200330 HELENA WONG E21 35370.00 E21 200340 ROY ALONZO E21 31840.00 E21 42 record(s) selected. 以及更新命令: db2 => update gmilne.emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','E01')) where WORKDEPT='E01' DB20000I The SQL command completed successfully. 可以看到,Jane 对表中的所有数据有完全的访问权。现在,看看 Joe 可以看到的内容。首先进行选择。 db2 => select EMPNO, FIRSTNME, LASTNAME, WORKDEPT, SALARY, varchar(SECLABEL_TO_CHAR('J_DEPT_POLICY',DEPT_TAG),30) from gmilne.emp EMPNO FIRSTNME LASTNAME WORKDEPT SALARY 6 ------ ------------ --------------- -------- ----------- ------------------------------ 000060 IRVING STERN D11 72250.00 D11 000100 THEODORE SPENSER E21 86150.00 E21 000150 BRUCE ADAMSON D11 55280.00 D11 000160 ELIZABETH PIANKA D11 62250.00 D11 000170 MASATOSHI YOSHIMURA D11 44680.00 D11 000180 MARILYN SCOUTTEN D11 51340.00 D11 000190 JAMES WALKER D11 50450.00 D11 000200 DAVID BROWN D11 57740.00 D11 000210 WILLIAM JONES D11 68270.00 D11 000220 JENNIFER LUTZ D11 49840.00 D11 000320 RAMLAL MEHTA E21 39950.00 E21 000330 WING LEE E21 45370.00 E21 000340 JASON GOUNOT E21 43840.00 E21 200170 KIYOSHI YAMAMOTO D11 64680.00 D11 200220 REBA JOHN D11 69840.00 D11 200330 HELENA WONG E21 35370.00 E21 200340 ROY ALONZO E21 31840.00 E21 17 record(s) selected. 看到了吗?他只能看到 D11 和 E21 部门的信息。如果他试图选择不允许他访问的表数据,那么会发生什么: db2 => select EMPNO, FIRSTNME, LASTNAME, WORKDEPT, SALARY, varchar(SECLABEL_TO_CHAR('J_DEPT_POLICY',DEPT_TAG),30) from gmilne.emp where empno='000130' EMPNO FIRSTNME LASTNAME WORKDEPT SALARY 6 ------ ------------ --------------- -------- ----------- ------------------------------ 0 record(s) selected. 在前面 Jane 进行选择的结果中我们看到,有一个职员的 empno 是 000130,但是不允许 Joe 看到它。 现在是最后一个测试,对于用户 Frank 的测试。 首先,运行与前两个用户相同的选择: db2 => select EMPNO, FIRSTNME, LASTNAME, WORKDEPT, SALARY, varchar(SECLABEL_TO_CHAR('J_DEPT_POLICY',DEPT_TAG),30) from gmilne.emp EMPNO FIRSTNME LASTNAME WORKDEPT SALARY 6 ------ ------------ --------------- -------- ----------- ------------------------------ 000010 CHRISTINE HAAS A00 152750.00 A00 000110 VINCENZO LUCCHESSI A00 66500.00 A00 000120 SEAN O'CONNELL A00 49250.00 A00 200010 DIAN HEMMINGER A00 46500.00 A00 200120 GREG ORLANDO A00 39250.00 A00 5 record(s) selected. 在这里可以看到,Frank 只能看到部门中他领导的用户的相关信息。我们来看看在他尝试进行更新时会发生什么: db2 => update gmilne.emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','A00')) where WORKDEPT='A00'DB21034E The command was processed as an SQL statement because it was not a valid Command Line Processor command. During SQL processing it returned: SQL20402N Authorization ID "FRANK" does not have the LBAC credentials to perform the "UPDATE" operation on table "EMPLOYEE". SQLSTATE=42519 尽管他尝试更新的记录是在自己的部门中,但是访问安全策略只允许他对表进行读访问。我们的业务需求已经得到了满足。 |