天天看點

DB2的權限管理(原創)

db2 授權簡介 

使用者被授予的權限級别 

允許使用者運作的指令 

允許使用者讀取和/或修改的資料 

允許使用者建立、修改和/或删除的資料庫對象

授權由特權組和進階資料庫管理程式(執行個體級)維護和實用操作組成。在db2可用的5種權限中,sysadm、sysctrl 和sysmaint是執行個體級權限 。這意味着它們的範圍包含執行個體級指令以及針對這個執行個體中的所有資料庫的指令。這些權限隻能配置設定給組;可以通過dbm cfg檔案配置設定這些權限。

針對特定資料庫的dbadm和load權限可以配置設定給使用者或使用者組。可以使用grant指令顯式地配置設定這些權限。

以下幾節描述如何配置設定每種權限以及允許擁有此權限的使用者執行哪些指令。

注意,任何提到組成員關系的地方都假設在作業系統級上已經定義了這些使用者群組名。

使用者可以通過發出以下指令來判斷自己擁有哪些權限和資料庫級特權:

$db2 get authorizations 

獲得sysadm權限 

db2中的sysadm權限就像是unix上的根權限或windows上的administrator 權限。對一個db2執行個體擁有sysadm權限的使用者能夠對這個執行個體、這個執行個體中的任何資料庫以及這些資料庫中的任何對象發出任何db2指令。他們還能夠通路資料庫中的資料以及對其他使用者授予或撤消特權或權限。隻允許sysadm使用者更新dbm cfg檔案。

sysadm權限由dbm cfg檔案中的sysadm_group參數控制。在windows上,在建立執行個體時,這個參數設定為 administrator(但是,如果發出指令 <code>db2 get dbm cfg</code> ,它看起來是空的)。在 unix 上,它設定為建立這個執行個體的使用者的主組。

因為隻允許sysadm使用者更新dbm cfg檔案,是以隻有他們能夠向其他組授予任何sys*權限。以下示例示範如何向db2grp1 組授予 sysadm 權限:

db2 update dbm cfg using sysadm_group db2grp1 

請記住,這一修改直到執行個體停止并重新啟動之後才會生效。還要記住,如果您目前不是作為 db2grp1 組的成員登入的,那麼就無權重新啟動執行個體!您必須登出并用正确的組中的 id 重新登入,或者将自己目前的id添加進 db2grp1 組中。

獲得sysctrl權限 

擁有sysctrl權限的使用者可以在執行個體中執行所有管理和維護指令。但是,與sysadm使用者不同,他們不能通路資料庫中的任何資料,除非他們被授予了通路資料所需的特權。sysctrl 使用者可以對執行個體中的任何資料庫執行的指令示例如下: 

db2start/db2stop

db2 create/drop database

db2 create/drop tablespace

db2 backup/restore/rollforward database

db2 runstats (針對任何表)

db2 update db cfg for database dbname 

擁有 sysadm 權限的使用者可以使用以下指令将 sysctrl 配置設定給一個組:

db2 update dbm cfg using sysctrl_group group name 

獲得sysmaint權限 

擁有sysmaint權限的使用者可以發出的指令是擁有sysctrl權限的使用者可以發出的指令的子集。sysmaint 使用者隻能執行與維護相關的任務,比如:

注意,擁有sysmaint權限的使用者不能建立或删除資料庫或表空間。他們也不能通路資料庫中的任何資料,除非他們被顯式地授予通路資料所需的特權。

如果您擁有 sysadm 權限,那麼可以使用以下指令将 sysmaint 權限配置設定給一個組:

db2 update dbm cfg using sysmaint_group group name 

獲得dbadm權限 

dbadm 權限是一個資料庫級權限,而不是執行個體級權限。dbadm使用者對一個資料庫有幾乎完全的控制能力。dbadm使用者不能執行某些維護或管理任務,比如:

drop database

drop/create tablespace

backup/restore database

update db cfg for database db name 

但是,他們可以執行以下任務:

db2 create/drop table

db2 grant/revoke (任何特權)

db2 runstats (任何表) 

dbadm使用者還被自動地授予對資料庫對象及其内容的所有特權。因為 dbadm 權限是一個資料庫級權限,是以它可以被配置設定給使用者和使用者組。以下指令示範授予dbadm 權限的不同方法。 

db2 create database test 

這個指令将資料庫test上的dbadm權限隐式地授予發出此指令的使用者。

db2 connect to sample

db2 grant dbadm on database to user tst1 

這個指令隻能由 sysadm 使用者發出;它向使用者 tst1 授予示例資料庫上的dbadm權限。注意,在授予dbadm權限之前,發出這個指令的使用者必須連接配接到示例資料庫。

db2 grant dbadm on database to group db2grp1 

這個指令将 dbadm 權限授予 db2grp1 組中的每個使用者。同樣,隻有 sysadm 使用者能夠發出這個指令。

獲得load權限 

load權限是一個資料庫級權限,是以它可以被配置設定給使用者和使用者組。顧名思義,load權限允許使用者對表發出load指令。當用大量資料填充表時,load指令通常用來替代插入或導入指令,它的速度更快。根據您希望執行的load 操作類型,僅僅擁有 load權限可能還不夠。可能還需要表上的特定特權。

擁有load權限的使用者可以運作以下指令:

db2 quiesce tablespaces for table

db2 list tablespaces

db2 runstats (任何表)

db2 load insert (必須有表上的插入特權)

db2 load restart/terminate after load insert (必須有表上的插入特權)

db2 load replace (必須有表上的插入和删除特權)

db2 load restart/terminate after load replace (必須有表上的插入和删除特權) 

隻有擁有sysadm或dbadm權限的使用者能夠對使用者或使用者組授予或撤消 load 權限。以下示例示範load權限如何允許我們的使用者使用 <code>load</code> 指令将資料裝載進 sales 表中。假設已經發出了指令 <code>db2 connect to sample</code> 。

db2 grant load on database to user tst1

db2 grant insert on table sales to user tst1 

有了 load 權限和插入特權,tst1 就可以對 sales 表發出 load insert 或 load restart ,或者在load insert之後發出terminate 。

db2 grant load on database to group grp1

db2 grant delete on table sales to group grp1

db2 grant insert on table sales to group grp1

有了 load 權限以及删除和插入特權,grp1的任何成員就可以對sales表發出 load replace 或 load restart ,或者在 load replace 之後發出 terminate 。

db2對象特權

使用者可以擁有的資料庫級特權有:

createtab: 使用者可以在資料庫中建立表。

bindadd: 使用者可以使用bind指令在資料庫中建立包。

connect: 使用者可以連接配接資料庫。

create_not_fenced: 使用者可以建立unfenced使用者定義函數(udf)。

implicit_schema: 使用者可以在資料庫中隐式地建立模式,而不需要使用 create schema 指令。

load: 使用者可以将資料裝載進表中。

quiesce_connect: 使用者可以通路處于靜默(quiesced)狀态的資料庫。

create_external_routine: 使用者可以建立供應用程式和資料庫的其他使用者使用的過程。

資料庫對象 包括表、視圖、索引、模式和包。幸運的是,大多數對象級特權的意義無需解釋。下表總結了這些特權。

特權名稱

相關對象

描述

control

表、視圖、索引、包、别名、不同的類型、使用者定義函數、序列

提供對對象的全部權限。擁有這種特權的使用者還可以向其他使用者授予或撤消對對象的特權。

delete

表、視圖

允許使用者從對象中删除記錄。

insert

允許使用者通過 insert 或 import 指令将記錄插入對象中。

select

提供使用選擇語句來檢視對象内容的能力。

update

允許使用者使用更新語句修改對象中的記錄。

alter

允許使用者使用更改語句更改對象定義。

index

允許使用者使用建立索引語句在對象上建立索引。

references

提供在對象上建立或删除外鍵限制的能力。

bind

允許使用者重新綁定現有的包。

execute

包、過程、函數、方法

允許使用者執行包和例程。

alterin

模式

允許使用者修改模式中的對象定義。

createin

允許使用者在模式中建立對象。

dropin

允許使用者删除模式中的對象。

關于對象級特權的資訊存儲在系統編目視圖中。視圖名稱是<code>syscat.tabauth</code> 、<code>syscat.colauth</code>、<code>syscat.indexauth</code> 、<code>syscat.schemaauth</code> 、<code>syscat.routineauth</code> 和 <code>syscat.packageauth</code> 。

顯式特權

可以使用 grant 和 revoke 指令顯式地 對使用者或組授予或撤消特權。我們來看看如何在各種對象上使用這些指令。

作為擁有 administrator 權限的使用者登入 windows,打開兩個 db2 指令視窗。在這兩個視窗中,確定将 <code>db2instance</code> 變量設定為 <code>db2</code> !

在第一個視窗中發出以下命:

db2 connect to sample 

現在,在第二個視窗中發出以下指令:

db2 connect to sample user test1 using password 

請記住,第一個視窗中的指令是由一個擁有 sysadm 權限的使用者發出的。第二個視窗中的指令是由 tst1 發出的,這個使用者對示例資料庫沒有特殊的權限或特權。注意,與示例資料庫中的表相關聯的模式名是發出 <code>db2sampl</code> 指令的使用者的名稱。在這些示例中,這個使用者是 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 

<code>drop table</code> 指令現在應該會成功完成。

既然已經完成了示例,就可以撤消剛才授予的特權。在第一個視窗中發出以下指令:

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語句。下表總結了會導緻資料庫管理程式隐式地授予特權的一些指令。注意,當删除建立的對象時,這些特性會隐式地撤消。但是,當顯式地撤消更進階的特權時,不會撤消它們。

發出的指令

授予的特權

被授予特權的使用者

<code>create table mytable</code>

mytable 上的 control

發出指令的使用者

<code>create schema myschema</code>

myschema 上的 createin、alterin 和 dropin,以及将這些特權授予其他使用者的能力

<code>create view myview</code>

myview 上的 control(隻有在使用者擁有myview定義中引用的所有表和視圖上的control特權的情況下)

<code>create database mydb</code>

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需要幾個步驟。必須做的第一件事情是,決定對于您的資料需要什麼類型的通路控制。

我們做出以下假設。在您的組織中有三類人。

名稱

在組織中的角色

jane

人力資源執行官

joe

d11 和 e21 部門的經理

frank

團隊主管 - a00 部門

現在,在組織的資料庫中有一個定義職員資訊的表。這個表類似于 sample 資料庫中的emp 表。它包含關于職員和他們所屬的部門的資料。它現在的定義如下:

db2 =&gt; 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 =&gt; 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.

db2=&gt;update emp set dept_tag=(seclabel_by_name('j_dept_policy','a00')) where workdept='a00'

db2=&gt;update emp set dept_tag=(seclabel_by_name('j_dept_policy','b01')) where workdept='b01'

db2=&gt;update emp set dept_tag=(seclabel_by_name('j_dept_policy','c01')) where workdept='c01'

db2=&gt;update emp set dept_tag=(seclabel_by_name('j_dept_policy','d11')) where workdept='d11'

db2=&gt;update emp set dept_tag=(seclabel_by_name('j_dept_policy','d21')) where workdept='d21'

db2=&gt;update emp set dept_tag=(seclabel_by_name('j_dept_policy','e01')) where workdept='e01'

db2=&gt;update emp set dept_tag=(seclabel_by_name('j_dept_policy','e11')) where workdept='e11'

db2=&gt;update emp set dept_tag=(seclabel_by_name('j_dept_policy','e21')) where workdept='e21' 

varchar(seclabel_to_char('j_dept_policy',dept_tag),30) from emp

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 =&gt; update gmilne.emp set dept_tag=(seclabel_by_name('j_dept_policy','e01')) 

where workdept='e01' db20000i  the sql command completed successfully. 

可以看到,jane 對表中的所有資料有完全的通路權。現在,看看 joe 可以看到的内容。首先進行選擇。

  17 record(s) selected. 

看到了嗎?他隻能看到 d11 和 e21 部門的資訊。如果他試圖選擇不允許他通路的表資料,那麼會發生什麼:

varchar(seclabel_to_char('j_dept_policy',dept_tag),30) 

from gmilne.emp where empno='000130'

  0 record(s) selected. 

在前面 jane 進行選擇的結果中我們看到,有一個職員的empno 是 000130,但是不允許 joe 看到它。

現在是最後一個測試,對于使用者 frank 的測試。

首先,運作與前兩個使用者相同的選擇:

  5 record(s) selected. 

在這裡可以看到,frank 隻能看到部門中他上司的使用者的相關資訊。我們來看看在他嘗試進行更新時會發生什麼:

db2 =&gt; 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 

盡管他嘗試更新的記錄是在自己的部門中,但是通路安全政策隻允許他對表進行讀通路。我們的業務需求已經得到了滿足。

參考至:http://www.ibm.com/developerworks/cn/education/data/db2-cert7302/section5.html

本文原創,轉載請注明出處、作者

如有錯誤,歡迎指正

郵箱:[email protected]

作者:czmmiao  文章出處:http://czmmiao.iteye.com/blog/1379093