數據庫和對象特權
db2數據庫特權大體上分成兩類:數據庫級特權(針對數據庫中的所有對象)和對象級特權(與特定的對象相關聯)。
用戶可以擁有的數據庫級特權有:
數據庫對象 包括表、視圖、索引、模式和包。幸運的是,大多數對象級特權的意義無需解釋。下表總結了這些特權。
特權名稱 相關對象 描述 CONTROL 表、視圖、索引、包、別名、不同的類型、用戶定義函數、序列 提供對對象的全部權限。擁有這種特權的用戶還可以向其他用戶授予或撤消對對象的特權。 DELETE 表、視圖 允許用戶從對象中刪除記錄。
INSERT 表、視圖 允許用戶通過 INSERT 或 IMPORT 命令將記錄插入對象中。 SELECT 表、視圖 提供使用選擇語句來查看對象內容的能力。 UPDATE 表、視圖 允許用戶使用更新語句修改對象中的記錄。 ALTER 表 允許用戶使用更改語句更改對象定義。 INDEX 表 允許用戶使用創建索引語句在對象上創建索引。 REFERENCES 表 提供在對象上創建或刪除外鍵約束的能力。 BIND 包 允許用戶重新綁定現有的包。 EXECUTE 包、過程、函數、方法 允許用戶執行包和例程。 ALTERIN 模式 允許用戶修改模式中的對象定義。 CREATEIN 模式 允許用戶在模式中創建對象。 DROPIN 模式 允許用戶刪除模式中的對象。
關於對象級特權的信息存儲在系統編目視圖中。視圖名稱是 syscat.tabauth、syscat.colauth、syscat.indexauth、syscat.schemaauth、syscat.routineauth 和 syscat.packageauth。
顯式特權
可以使用 GRANT 和 REVOKE 命令顯式地 對用戶或組授予或撤消特權。我們來看看如何在各種對象上使用這些命令。
作為擁有 Administrator 權限的用戶登錄 Windows,打開兩個 DB2 命令窗口。在這兩個窗口中,確保將 db2instance 變量設置為 DB2!
在第一個窗口中發出以下命»:
db2 connect to sample
現在,在第二個窗口中發出以下命令:
db2 connect to sample user test1 using passWord
請記住,第一個窗口中的命令是由一個擁有 SYSADM 權限的用戶發出的。第二個窗口中的命令是由 tst1 發出的,這個用戶對示例數據庫沒有特殊的權限或特權。注意,與示例數據庫中的表相關聯的模式名是發出 db2sampl 命令的用戶的名稱。在這些示例中,這個用戶是 GMILNE。
現在,在第二個窗口中發出以下命令: db2 select * from gmilne.org
應該會看到以下響應:
SQL0551N "TEST1" does not have the privilege to perform Operation "SELECT"
on object "GMILNE.ORG".
為了糾正這種狀況,在第一個窗口中發出以下命令:
db2 grant select on table gmilne.org to user test1
現在,前面的命令就會成功!接下來,在第二個窗口中發出一個更復雜的命令:
db2 insert into gmilne.org values (100, ''Tutorial'', 1, ''Eastern'', ''Toronto'')
同樣會看到錯誤消息:
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"
on object "GMILNE.EMP_PHOTO".
所以,我們要授予這個特權。在第一個窗口中輸入以下命令:
db2 grant dropin on schema gmilne to all
DROP TABLE 命令現在應該會成功完成。
既然已經完成了示例,就可以撤消剛才授予的特權。在第一個窗口中發出以下命令:
db2 revoke select on table gmilne.org from user test1
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 語句。下表總結了會導致數據庫管理程序隱式地授予特權的一些命令。注意,當刪除創建的對象時,這些特性會隱式地撤消。但是,當顯式地撤消更高級的特權時,不會撤消它們。
發出的命令 授予的特權 被授予特權的用戶 CREATE TABLE mytable
mytable 上的 CONTROL 發出命令的用戶 CREATE SCHEMA myschema
myschema 上的 CREATEIN、ALTERIN 和 DROPIN,以及將這些特權授予其他用戶的能力 發出命令的用戶 CREATE VIEW myvIEw
myvIEw 上的 CONTROL(只有在用戶擁有 myvIEw 定義中引用的所有表和視圖上的 CONTROL 特權的情況下) 發出命令的用戶 CREATE DATABASE mydb
mydb 的系統編目表上的 SELECT,mydb 上的 IMPLICIT_SCHEMA * PUBLIC**
*當用戶創建數據庫時,隱式地授予這個用戶這個數據庫上的 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 需要幾個步驟。必須做的第一件事情是,決定對於您的數據需要什麼類型的訪問控制。
我們做出以下假設。在您的組織中有三類人。
名稱 在組織中的角色 Jane 人力資源執行官 Joe D11 和 E21 部門的經理 Frank 團隊主管 - A00 部門
現在,在組織的數據庫中有一個定義職員信息的表。這個表類似於 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 adzoneid=892989" target="_blank">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 JEFFERSOND21 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."#CC0000">
在這裡可以看到,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
盡管他嘗試更新的記錄是在自己的部門中,但是訪問安全策略只允許他對表進行讀訪問。我們的業務需求已經得到了滿足。