1、創(chuàng)建系統(tǒng)用戶dbuser/ehong隸屬于db2users???
2、C:\Program Files\IBM\SQLLIB\BIN>db2 connect to AKZXTEST
數(shù)據(jù)庫連接信息
?數(shù)據(jù)庫服務(wù)器???????? = DB2/NT 9.7.3
?SQL 授權(quán)標(biāo)識(shí)???????? = ADMINIST...
?本地?cái)?shù)據(jù)庫別名?????? = AKZXTEST
3、給用戶授權(quán)
授予連接權(quán)限
C:\Program Files\IBM\SQLLIB\BIN>db2 grant
connect
on database to user dbuser
DB20000I? SQL 命令成功完成。?
這里可以授予的數(shù)據(jù)庫級(jí)特權(quán)有:
CREATETAB: 用戶可以在數(shù)據(jù)庫中創(chuàng)建表。
BINDADD: 用戶可以使用 BIND 命令在數(shù)據(jù)庫中創(chuàng)建包。
CONNECT: 用戶可以連接數(shù)據(jù)庫。
CREATE_NOT_FENCED: 用戶可以創(chuàng)建 unfenced 用戶定義函數(shù)(UDF)。
IMPLICIT_SCHEMA: 用戶可以在數(shù)據(jù)庫中隱式地創(chuàng)建模式,而不需要使用 CREATE SCHEMA 命令。
LOAD: 用戶可以將數(shù)據(jù)裝載進(jìn)表中。
QUIESCE_CONNECT: 用戶可以訪問處于靜默(quiesced)狀態(tài)的數(shù)據(jù)庫。
CREATE_EXTERNAL_ROUTINE: 用戶可以創(chuàng)建供應(yīng)用程序和數(shù)據(jù)庫的其他用戶使用的過程。
secadm:安全性管理員
Dbadm:DBADM?用戶對(duì)一個(gè)數(shù)據(jù)庫有幾乎完全的控制能力。DBADM?用戶不能執(zhí)行某些維護(hù)或管理任務(wù)
4、測(cè)試連接
C:\Program Files\IBM\SQLLIB\BIN>db2 connect to AKZXTEST user dbuser? using ehong
數(shù)據(jù)庫連接信息
?數(shù)據(jù)庫服務(wù)器???????? = DB2/NT 9.7.3
?SQL 授權(quán)標(biāo)識(shí)???????? = DBUSER
?本地?cái)?shù)據(jù)庫別名?????? = AKZXTEST
###############################################
db2 數(shù)據(jù)庫特權(quán)大體上分成兩類:數(shù)據(jù)庫級(jí)特權(quán)(針對(duì)數(shù)據(jù)庫中的所有對(duì)象)和對(duì)象級(jí)特權(quán)(與特定的對(duì)象相關(guān)聯(lián))。
1、DBADM
?用戶對(duì)一個(gè)數(shù)據(jù)庫有幾乎完全的控制能力。DBADM?用戶不能執(zhí)行某些維護(hù)或管理任務(wù),比如:
*?drop?database
*?drop/create?tablespace
*?backup/restore?database
*?update?db?cfg?for?database?db?name?
但是,他們可以執(zhí)行以下任務(wù):
*?db2?create/drop?table
*?db2?grant/revoke(任何特權(quán))
*?db2?runstats(任何表)?
DBADM?用戶還被自動(dòng)地授予對(duì)數(shù)據(jù)庫對(duì)象及其內(nèi)容的所有特權(quán)。因?yàn)?DBADM?權(quán)限是一個(gè)數(shù)據(jù)庫級(jí)權(quán)限,所以它可以被分配給用戶和用戶組。以下命令演示授予?DBADM?權(quán)限的不同方法。
*?db2?create?database?test
???這個(gè)命令將數(shù)據(jù)庫?test?上的?DBADM?權(quán)限隱式地授予發(fā)出此命令的用戶。
*?db2?connect?to?sample
???db2?grant?dbadm?on?database?to?user?tst1
???這個(gè)命令只能由?SYSADM?用戶發(fā)出;它向用戶?tst1?授予示例數(shù)據(jù)庫上的?DBADM?權(quán)限。注意,在授予?DBADM?權(quán)限之前,發(fā)出這個(gè)命令的用戶必須連接到示例數(shù)據(jù)庫。
*?db2?grant?dbadm?on?database?to?group?db2grp1
???這個(gè)命令將?DBADM?權(quán)限授予?db2grp1?組中的每個(gè)用戶。同樣,只有?SYSADM?用戶能夠發(fā)出這個(gè)命令。
2、?LOAD?權(quán)限
LOAD?權(quán)限是一個(gè)數(shù)據(jù)庫級(jí)權(quán)限,所以它可以被分配給用戶和用戶組。顧名思義,LOAD?權(quán)限允許用戶對(duì)表發(fā)出?LOAD?命令。當(dāng)用大量數(shù)據(jù)填充表時(shí),LOAD?命令通常用來替代插入或?qū)朊睿乃俣雀臁8鶕?jù)您希望執(zhí)行的?LOAD?操作類型,僅僅擁有?LOAD?權(quán)限可能還不夠。可能還需要表上的特定特權(quán)。
擁有?LOAD?權(quán)限的用戶可以運(yùn)行以下命令:
*?db2?quiesce?tablespaces?for?table
*?db2?list?tablespaces
*?db2?runstats(任何表)
*?db2?load?insert(必須有表上的插入特權(quán))
*?db2?load?restart/terminate?after?load?insert(必須有表上的插入特權(quán))
*?db2?load?replace(必須有表上的插入和刪除特權(quán))
*?db2?load?restart/terminate?after?load?replace(必須有表上的插入和刪除特權(quán))?
只有擁有?SYSADM?或?DBADM?權(quán)限的用戶能夠?qū)τ脩艋蛴脩艚M授予或撤消?LOAD?權(quán)限。以下示例演示?LOAD?權(quán)限如何允許我們的用戶使用?LOAD?命令將數(shù)據(jù)裝載進(jìn)?sales?表中。假設(shè)已經(jīng)發(fā)出了命令?db2?connect?to?sample。
*?db2?grant?load?on?database?to?user?tst1
???db2?grant?insert?on?table?sales?to?user?tst1
???有了?LOAD?權(quán)限和插入特權(quán),tst1?就可以對(duì)?sales?表發(fā)出?LOAD?INSERT?或?LOAD?RESTART,或者在?LOAD?INSERT?之后發(fā)出?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?權(quán)限以及刪除和插入特權(quán),grp1?的任何成員就可以對(duì)?sales?表發(fā)出?LOAD?REPLACE?或?LOAD?RESTART,或者在?LOAD?REPLACE?之后發(fā)出?TERMINATE。?
3.其他特權(quán)
用戶可以擁有的數(shù)據(jù)庫級(jí)特權(quán)有:
*?CREATETAB:?用戶可以在數(shù)據(jù)庫中創(chuàng)建表。
*?BINDADD:?用戶可以使用?BIND?命令在數(shù)據(jù)庫中創(chuàng)建包。
*?CONNECT:?用戶可以連接數(shù)據(jù)庫。
*?CREATE_NOT_FENCED:?用戶可以創(chuàng)建?unfenced?用戶定義函數(shù)(UDF)。
*?IMPLICIT_SCHEMA:?用戶可以在數(shù)據(jù)庫中隱式地創(chuàng)建模式,而不需要使用?CREATE?SCHEMA?命令。
*?LOAD:?用戶可以將數(shù)據(jù)裝載進(jìn)表中。
*?QUIESCE_CONNECT:?用戶可以訪問處于靜默(quiesced)狀態(tài)的數(shù)據(jù)庫。
*?CREATE_EXTERNAL_ROUTINE:?用戶可以創(chuàng)建供應(yīng)用程序和數(shù)據(jù)庫的其他用戶使用的過程。?
數(shù)據(jù)庫對(duì)象?包括表、視圖、索引、模式和包。幸運(yùn)的是,大多數(shù)對(duì)象級(jí)特權(quán)的意義無需解釋。下表總結(jié)了這些特權(quán)。
特權(quán)名稱?相關(guān)對(duì)象?描述
CONTROL?表、視圖、索引、包、別名、不同的類型、用戶定義函數(shù)、序列?提供對(duì)對(duì)象的全部權(quán)限。擁有這種特權(quán)的用戶還可以向其他用戶授予或撤消對(duì)對(duì)象的特權(quán)。
DELETE?表、視圖?允許用戶從對(duì)象中刪除記錄。
INSERT?表、視圖?允許用戶通過?INSERT?或?IMPORT?命令將記錄插入對(duì)象中。
SELECT?表、視圖?提供使用選擇語句來查看對(duì)象內(nèi)容的能力。
UPDATE?表、視圖?允許用戶使用更新語句修改對(duì)象中的記錄。
ALTER?表?允許用戶使用更改語句更改對(duì)象定義。
INDEX?表?允許用戶使用創(chuàng)建索引語句在對(duì)象上創(chuàng)建索引。
REFERENCES?表?提供在對(duì)象上創(chuàng)建或刪除外鍵約束的能力。
BIND?包?允許用戶重新綁定現(xiàn)有的包。
EXECUTE?包、過程、函數(shù)、方法?允許用戶執(zhí)行包和例程。
ALTERIN?模式?允許用戶修改模式中的對(duì)象定義。
CREATEIN?模式?允許用戶在模式中創(chuàng)建對(duì)象。
DROPIN?模式?允許用戶刪除模式中的對(duì)象。
關(guān)于對(duì)象級(jí)特權(quán)的信息存儲(chǔ)在系統(tǒng)編目視圖中。視圖名稱是?syscat.tabauth、syscat.colauth、syscat.indexauth、syscat.schemaauth、syscat.routineauth?和?syscat.packageauth。
顯式特權(quán)
可以使用?GRANT?和?REVOKE?命令顯式地?對(duì)用戶或組授予或撤消特權(quán)。我們來看看如何在各種對(duì)象上使用這些命令。
作為擁有?Administrator?權(quán)限的用戶登錄?Windows,打開兩個(gè)?DB2?命令窗口。在這兩個(gè)窗口中,確保將?db2instance?變量設(shè)置為?DB2!
在第一個(gè)窗口中發(fā)出以下命?¤:
db2?connect?to?sample
現(xiàn)在,在第二個(gè)窗口中發(fā)出以下命令:
db2?connect?to?sample?user?test1?using?password
請(qǐng)記住,第一個(gè)窗口中的命令是由一個(gè)擁有?SYSADM?權(quán)限的用戶發(fā)出的。第二個(gè)窗口中的命令是由?tst1?發(fā)出的,這個(gè)用戶對(duì)示例數(shù)據(jù)庫沒有特殊的權(quán)限或特權(quán)。注意,與示例數(shù)據(jù)庫中的表相關(guān)聯(lián)的模式名是發(fā)出?db2sampl?命令的用戶的名稱。在這些示例中,這個(gè)用戶是?GMILNE。
現(xiàn)在,在第二個(gè)窗口中發(fā)出以下命令:
db2?select?*?from?gmilne.org
應(yīng)該會(huì)看到以下響應(yīng):
SQL0551N???"TEST1"?does?not?have?the?privilege?to?perform?operation?"SELECT"?
on?object?"GMILNE.ORG".
為了糾正這種狀況,在第一個(gè)窗口中發(fā)出以下命令:
db2?grant?select?on?table?gmilne.org?to?user?test1
現(xiàn)在,前面的命令就會(huì)成功!接下來,在第二個(gè)窗口中發(fā)出一個(gè)更復(fù)雜的命令:
db2?insert?into?gmilne.org?values?(100,?'Tutorial',?1,?'Eastern',?'Toronto')
同樣會(huì)看到錯(cuò)誤消息:
SQL0551N???"TEST1"?does?not?have?the?privilege?to?perform?operation???"INSERT"?
on?object?"GMILNE.ORG"
所以,在第一個(gè)窗口中輸入以下命令:
db2?grant?insert?on?table?gmilne.org?to?group?db2grp1
原來失敗的?INSERT?命令現(xiàn)在應(yīng)該會(huì)成功完成,因?yàn)?test1?是?db2grp1?組的成員。
現(xiàn)在,在第二個(gè)窗口中輸入以下命令:
db2?drop?table?gmilne.emp_photo
同樣會(huì)看到錯(cuò)誤消息:
SQL0551N???"TEST1"?does?not?have?the?privilege?to?perform?operation?"DROP?TABLE"
on?object?"GMILNE.EMP_PHOTO".
所以,我們要授予這個(gè)特權(quán)。在第一個(gè)窗口中輸入以下命令:
db2?grant?dropin?on?schema?gmilne?to?all
DROP?TABLE?命令現(xiàn)在應(yīng)該會(huì)成功完成。
既然已經(jīng)完成了示例,就可以撤消剛才授予的特權(quán)。在第一個(gè)窗口中發(fā)出以下命令:
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
注意,從組中撤消特權(quán)不一定會(huì)從這個(gè)組的所有成員撤消它。例如,以下命令可以用來從?db2grp1?撤消對(duì)?gmilne.org?表的所有特權(quán)(CONTROL?除外):
db2?revoke?all?on?table?gmilne.org?from?group?db2grp1
但是,test1?用戶(他是?db2grp1?的成員)仍然擁有對(duì)這個(gè)表的選擇特權(quán),因?yàn)樗蛩潜恢苯邮谟柽@個(gè)特權(quán)的。
隱式特權(quán)
當(dāng)發(fā)出某些命令時(shí),DB2?可能會(huì)自動(dòng)地授予特權(quán),而不需要像前面看到的那樣發(fā)出顯式的?GRANT?語句。下表總結(jié)了會(huì)導(dǎo)致數(shù)據(jù)庫管理程序隱式地授予特權(quán)的一些命令。注意,當(dāng)刪除創(chuàng)建的對(duì)象時(shí),這些特性會(huì)隱式地撤消。但是,當(dāng)顯式地撤消更高級(jí)的特權(quán)時(shí),不會(huì)撤消它們。
發(fā)出的命令?授予的特權(quán)?被授予特權(quán)的用戶
CREATE?TABLE?mytable?mytable?上的?CONTROL?發(fā)出命令的用戶
CREATE?SCHEMA?myschema?myschema?上的?CREATEIN、ALTERIN?和?DROPIN,以及將這些特權(quán)授予其他用戶的能力?發(fā)出命令的用戶
CREATE?VIEW?myview?myview?上的?CONTROL(只有在用戶擁有?myview?定義中引用的所有表和視圖上的?CONTROL?特權(quán)的情況下)?發(fā)出命令的用戶
CREATE?DATABASE?mydb?mydb?的系統(tǒng)編目表上的?SELECT,mydb?上的?IMPLICIT_SCHEMA?*?PUBLIC**
*當(dāng)用戶創(chuàng)建數(shù)據(jù)庫時(shí),隱式地授予這個(gè)用戶這個(gè)數(shù)據(jù)庫上的?DBADM?權(quán)限。獲得?DBADM?權(quán)限就會(huì)隱式地授予?CONNECT、CREATETAB、BINDADD、IMPLICIT_SCHEMA?和?CREATE_NOT_FENCED?特權(quán)。即使撤消了?DBADM?權(quán)限,這個(gè)用戶仍然會(huì)保留這些特權(quán)。
**PUBLIC?是一個(gè)特殊的?DB2?組,其中包括特定數(shù)據(jù)庫的所有用戶。與前面討論過的其他組不同,PUBLIC?不必在操作系統(tǒng)級(jí)進(jìn)行定義。在默認(rèn)情況下,會(huì)向?PUBLIC?授予一些特權(quán)。例如,這個(gè)組自動(dòng)接受數(shù)據(jù)庫上的?CONNECT?特權(quán)和編目表上的?SELECT?特權(quán)。可以對(duì)?PUBLIC?組發(fā)出?GRANT?和?REVOKE?命令,比如:
db2?grant?select?on?table?sysibm.systables?to?public
db2?revoke?select?on?table?sysibm.systables?from?public
間接特權(quán)
當(dāng)數(shù)據(jù)庫管理器執(zhí)行包?時(shí),可以間接獲得特權(quán)。包中包含一個(gè)或多個(gè)?SQL?語句,這些語句已經(jīng)轉(zhuǎn)換為?DB2?用來在內(nèi)部執(zhí)行它們的格式。換句話說,包中包含可執(zhí)行格式的多個(gè)?SQL?語句。如果包中的所有語句都是靜態(tài)的,那么用戶只需要有包上的?EXECUTE?特權(quán),就能夠成功地執(zhí)行包中的語句。
例如,假設(shè)?db2package1?執(zhí)行以下靜態(tài)的?SQL?語句:
db2?select?*?from?org
db2?insert?into?test?values?(1,?2,?3)
在這種情況下,擁有?db2package1?上的?EXECUTE?特權(quán)的用戶會(huì)間接地獲得?org?表上的?SELECT?特權(quán)和?test?表上的?INSERT?特權(quán)。
?
################## 關(guān)于 DB2 授權(quán)的研究 ###################################################
DB2 中有三種主要的安全機(jī)制,可以幫助 DBA 實(shí)現(xiàn)數(shù)據(jù)庫安全計(jì)劃: 身份驗(yàn)證( authentication ) 、 授權(quán)( authorization ) 和 特權(quán)( privilege ) 。
身份驗(yàn)證是用戶在嘗試訪問 DB2 實(shí)例或數(shù)據(jù)庫時(shí)遇到的第一種安全特性。DB2 身份驗(yàn)證與底層操作系統(tǒng)的安全特性緊密協(xié)作來檢驗(yàn)用戶 ID 和密碼。DB2 還可以利用 Kerberos 這樣的安全協(xié)議對(duì)用戶進(jìn)行身份驗(yàn)證。
授權(quán)決定用戶和/或用戶組可以執(zhí)行的操作以及他們可以訪問的數(shù)據(jù)對(duì)象。用戶執(zhí)行高級(jí)數(shù)據(jù)庫和實(shí)例管理操作的能力由指派給他們的權(quán)限決定。在 DB2 中有 5 種不同的權(quán)限級(jí)別:SYSADM、SYSCTRL、SYSMAINT、DBADM 和 LOAD。
特權(quán)的粒度比授權(quán)要細(xì),可以分配給用戶和/或用戶組。特權(quán)定義用戶可以創(chuàng)建或刪除的對(duì)象。它們還定義用戶可以用來訪問對(duì)象(比如表、視圖、索引和包)的命令。DB2 9 中新增的一個(gè)概念是基于標(biāo)簽的訪問控制(LBAC),它允許以更細(xì)的粒度控制誰有權(quán)訪問單獨(dú)的行和/或列。
1.DB2身份驗(yàn)證
DB2 使用 身份驗(yàn)證類型 決定在什么地方進(jìn)行身份驗(yàn)證。例如,在客戶機(jī) - 服務(wù)器環(huán)境中,是客戶機(jī)還是服務(wù)器檢驗(yàn)用戶的 ID 和密碼?在客戶機(jī) - 網(wǎng)關(guān) - 主機(jī)環(huán)境中,是客戶機(jī)還是主機(jī)檢驗(yàn)用戶的 ID 和密碼? 可以在DBM CFG中指定相應(yīng)的驗(yàn)證類型:
DB2 GET DBM CFG
Server Connection Authentication????????? (SRVCON_AUTH) = KERBEROS
Database manager authentication??????? (AUTHENTICATION) = SERVER_ENCRYPT
那么在連接實(shí)例時(shí)會(huì)使用 SERVER_ENCRYPT。但是在連接數(shù)據(jù)庫時(shí)會(huì)使用 KERBEROS 身份驗(yàn)證。
在客戶機(jī) - 網(wǎng)關(guān) - 主機(jī)環(huán)境中,這些身份驗(yàn)證選項(xiàng)在客戶機(jī)和網(wǎng)關(guān)上設(shè)置,而不是在主機(jī)上。
類型 |
描述 |
SERVER |
身份驗(yàn)證在服務(wù)器上進(jìn)行。 |
SERVER_ENCRYPT |
身份驗(yàn)證在服務(wù)器上進(jìn)行。密碼在客戶機(jī)上進(jìn)行加密,然后再發(fā)送到服務(wù)器。 |
CLIENT |
身份驗(yàn)證在客戶機(jī)上進(jìn)行. |
*KERBEROS |
由 Kerberos 安全軟件執(zhí)行身份驗(yàn)證。 |
*KRB_SERVER_ENCRYPT |
如果客戶機(jī)設(shè)置是 KERBEROS,那么由 Kerberos 安全軟件執(zhí)行身份驗(yàn)證。否則使用 SERVER_ENCRYPT。 |
DATA_ENCRYPT |
身份驗(yàn)證在服務(wù)器上進(jìn)行。服務(wù)器接受加密的用戶 ID 和密碼,并對(duì)數(shù)據(jù)進(jìn)行加密。這個(gè)選項(xiàng)的操作方式與 SERVER_ENCRYPT 相同,但是數(shù)據(jù)也要加密。 |
DATA_ENCRYPT_CMP |
身份驗(yàn)證方式與 DATA_ENCRYPT 相同,但是允許不支持 DATA_ENCRYPT 的老式客戶機(jī)使用 SERVER_ENCRYPT 身份驗(yàn)證進(jìn)行連接。在這種情況下,數(shù)據(jù)不進(jìn)行加密。如果進(jìn)行連接的客戶機(jī)支持 DATA_ENCRYPT,就會(huì)進(jìn)行數(shù)據(jù)加密,而不能降級(jí)到 SERVER_ENCRYPT 身份驗(yàn)證。這個(gè)身份驗(yàn)證類型只在服務(wù)器的數(shù)據(jù)庫管理程序配置文件中是有效的,而且在客戶機(jī)或網(wǎng)關(guān)實(shí)例上使用 CATALOG DATABASE 時(shí)是無效的。 |
GSSPLUGIN |
身份驗(yàn)證方式由一個(gè)外部 GSS-API 插件決定。 |
GSS_SERVER_ENCRYPT |
身份驗(yàn)證方式由一個(gè)外部 GSS-API 插件決定。在客戶機(jī)不支持服務(wù)器的 GSS-API 插件之一的情況下,使用 SERVER_ENCRYPT 身份驗(yàn)證。 |
2.授權(quán)
授權(quán)由特權(quán)組和高級(jí)數(shù)據(jù)庫管理程序(實(shí)例級(jí))維護(hù)和實(shí)用操作組成。在 DB2 可用的 5 種權(quán)限中,SYSADM、SYSCTRL 和 SYSMAINT 是 實(shí)例級(jí)權(quán)限 。這意味著它們的范圍包含實(shí)例級(jí)命令以及針對(duì)這個(gè)實(shí)例中的所有數(shù)據(jù)庫的命令。這些權(quán)限只能分配給組;可以通過 DBM CFG 文件分配這些權(quán)限。
針對(duì)特定數(shù)據(jù)庫的 DBADM 和 LOAD 權(quán)限可以分配給用戶或用戶組。可以使用 GRANT 命令顯式地分配這些權(quán)限。
獲得 SYSADM 權(quán)限
SYSADM 權(quán)限由 DBM CFG 文件中的 SYSADM_GROUP 參數(shù)控制。在 Windows 上,在創(chuàng)建實(shí)例時(shí),這個(gè)參數(shù)設(shè)置為 Administrator(但是,如果發(fā)出命令 db2 get dbm cfg,它看起來是空的)。在 UNIX 上,它設(shè)置為創(chuàng)建這個(gè)實(shí)例的用戶的主組。
因?yàn)橹辉试S SYSADM 用戶更新 DBM CFG 文件,所以只有他們能夠向其他組授予任何 SYS* 權(quán)限。以下示例演示如何向 db2grp1 組授予 SYSADM 權(quán)限:
db2 update dbm cfg using SYSADM_GROUP db2grp1 |
獲得 SYSCTRL 權(quán)限
擁有 SYSCTRL 權(quán)限的用戶可以在實(shí)例中執(zhí)行所有管理和維護(hù)命令。但是,與 SYSADM 用戶不同,他們不能訪問數(shù)據(jù)庫中的任何數(shù)據(jù),除非他們被授予了訪問數(shù)據(jù)所需的特權(quán)。SYSCTRL 用戶可以對(duì)實(shí)例中的任何數(shù)據(jù)庫執(zhí)行的命令示例如下:
db2start/db2stopdb2 create/drop databasedb2 create/drop tablespacedb2 backup/restore/rollforward databasedb2 runstats(針對(duì)任何表) db2 update db cfg for database dbname
擁有 SYSADM 權(quán)限的用戶可以使用以下命令將 SYSCTRL 分配給一個(gè)組:
db2 update dbm cfg using SYSCTRL_GROUP group name |
?
? |
獲得
SYSMAINT
權(quán)限
擁有 SYSMAINT 權(quán)限的用戶可以發(fā)出的命令是擁有 SYSCTRL 權(quán)限的用戶可以發(fā)出的命令的子集。SYSMAINT 用戶只能執(zhí)行與維護(hù)相關(guān)的任務(wù),比如:
db2start/db2stopdb2 backup/restore/rollforward databasedb2 runstats(針對(duì)任何表) db2 update db cfg for database dbname
注意,擁有 SYSMAINT 權(quán)限的用戶不能創(chuàng)建或刪除數(shù)據(jù)庫或表空間。他們也不能訪問數(shù)據(jù)庫中的任何數(shù)據(jù),除非他們被顯式地授予訪問數(shù)據(jù)所需的特權(quán)。
如果您擁有 SYSADM 權(quán)限,那么可以使用以下命令將 SYSMAINT 權(quán)限分配給一個(gè)組:
db2 update dbm cfg using SYSMAINT_GROUP group name |
獲得
DBADM
權(quán)限
DBADM 權(quán)限是一個(gè)數(shù)據(jù)庫級(jí)權(quán)限,而不是實(shí)例級(jí)權(quán)限。DBADM 用戶對(duì)一個(gè)數(shù)據(jù)庫有幾乎完全的控制能力。DBADM 用戶不能執(zhí)行某些維護(hù)或管理任務(wù),比如:
drop databasedrop/create tablespacebackup/restore databaseupdate db cfg for database db name
但是,他們可以執(zhí)行以下任務(wù):
db2 create/drop tabledb2 grant/revoke(任何特權(quán)) db2 runstats(任何表)
DBADM 用戶還被自動(dòng)地授予對(duì)數(shù)據(jù)庫對(duì)象及其內(nèi)容的所有特權(quán)。因?yàn)?DBADM 權(quán)限是一個(gè)數(shù)據(jù)庫級(jí)權(quán)限,所以它可以被分配給用戶和用戶組。以下命令演示授予 DBADM 權(quán)限的不同方法。
db2 create database test
這個(gè)命令將數(shù)據(jù)庫 test 上的 DBADM 權(quán)限隱式地授予發(fā)出此命令的用戶。
db2 connect to sample
db2 grant dbadm on database to user tst1
這個(gè)命令只能由 SYSADM 用戶發(fā)出;它向用戶 tst1 授予示例數(shù)據(jù)庫上的 DBADM 權(quán)限。注意,在授予 DBADM 權(quán)限之前,發(fā)出這個(gè)命令的用戶必須連接到示例數(shù)據(jù)庫。
db2 grant dbadm on database to group db2grp1
這個(gè)命令將 DBADM 權(quán)限授予 db2grp1 組中的每個(gè)用戶。同樣,只有 SYSADM 用戶能夠發(fā)出這個(gè)命令。
獲得 LOAD 權(quán)限
LOAD 權(quán)限是一個(gè)數(shù)據(jù)庫級(jí)權(quán)限,所以它可以被分配給用戶和用戶組。顧名思義,LOAD 權(quán)限允許用戶對(duì)表發(fā)出 LOAD 命令。當(dāng)用大量數(shù)據(jù)填充表時(shí),LOAD 命令通常用來替代插入或?qū)朊睿乃俣雀臁8鶕?jù)您希望執(zhí)行的 LOAD 操作類型,僅僅擁有 LOAD 權(quán)限可能還不夠。可能還需要表上的特定特權(quán)。
擁有 LOAD 權(quán)限的用戶可以運(yùn)行以下命令:
db2 quiesce tablespaces for tabledb2 list tablespacesdb2 runstats(任何表) db2 load insert(必須有表上的插入特權(quán)) db2 load restart/terminate after load insert(必須有表上的插入特權(quán)) db2 load replace(必須有表上的插入和刪除特權(quán)) db2 load restart/terminate after load replace(必須有表上的插入和刪除特權(quán))
只有擁有 SYSADM 或 DBADM 權(quán)限的用戶能夠?qū)τ脩艋蛴脩艚M授予或撤消 LOAD 權(quán)限。以下示例演示 LOAD 權(quán)限如何允許我們的用戶使用 LOAD 命令將數(shù)據(jù)裝載進(jìn) sales 表中。假設(shè)已經(jīng)發(fā)出了命令 db2 connect to sample。
db2 grant load on database to user tst1
db2 grant insert on table sales to user tst1
有了 LOAD 權(quán)限和插入特權(quán), tst1 就可以對(duì) sales 表發(fā)出 LOAD INSERT 或 LOAD RESTART,或者在 LOAD INSERT 之后發(fā)出 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 權(quán)限以及刪除和插入特權(quán), grp1 的任何成員就可以對(duì) sales 表發(fā)出 LOAD REPLACE 或 LOAD RESTART,或者在 LOAD REPLACE 之后發(fā)出 TERMINATE。?
3.特權(quán)
用戶可以擁有的數(shù)據(jù)庫級(jí)特權(quán)有:
CREATETAB: 用戶可以在數(shù)據(jù)庫中創(chuàng)建表。 BINDADD: 用戶可以使用 BIND 命令在數(shù)據(jù)庫中創(chuàng)建包。 CONNECT: 用戶可以連接數(shù)據(jù)庫。 CREATE_NOT_FENCED: 用戶可以創(chuàng)建 unfenced 用戶定義函數(shù)(UDF)。 IMPLICIT_SCHEMA: 用戶可以在數(shù)據(jù)庫中隱式地創(chuàng)建模式,而不需要使用 CREATE SCHEMA 命令。 LOAD: 用戶可以將數(shù)據(jù)裝載進(jìn)表中。 QUIESCE_CONNECT: 用戶可以訪問處于靜默(quiesced)狀態(tài)的數(shù)據(jù)庫。 CREATE_EXTERNAL_ROUTINE: 用戶可以創(chuàng)建供應(yīng)用程序和數(shù)據(jù)庫的其他用戶使用的過程。
數(shù)據(jù)庫 對(duì)象 包括表、視圖、索引、模式和包。幸運(yùn)的是,大多數(shù)對(duì)象級(jí)特權(quán)的意義無需解釋。下表總結(jié)了這些特權(quán)。
特權(quán)名稱 |
相關(guān)對(duì)象 |
描述 |
CONTROL |
表、視圖、索引、包、別名、不同的類型、用戶定義函數(shù)、序列 |
提供對(duì)對(duì)象的全部權(quán)限。擁有這種特權(quán)的用戶還可以向其他用戶授予或撤消對(duì)對(duì)象的特權(quán)。 |
DELETE |
表、視圖 |
允許用戶從對(duì)象中刪除記錄。 |
INSERT |
表、視圖 |
允許用戶通過 INSERT 或 IMPORT 命令將記錄插入對(duì)象中。 |
SELECT |
表、視圖 |
提供使用選擇語句來查看對(duì)象內(nèi)容的能力。 |
UPDATE |
表、視圖 |
允許用戶使用更新語句修改對(duì)象中的記錄。 |
ALTER |
表 |
允許用戶使用更改語句更改對(duì)象定義。 |
INDEX |
表 |
允許用戶使用創(chuàng)建索引語句在對(duì)象上創(chuàng)建索引。 |
REFERENCES |
表 |
提供在對(duì)象上創(chuàng)建或刪除外鍵約束的能力。 |
BIND |
包 |
允許用戶重新綁定現(xiàn)有的包。 |
EXECUTE |
包、過程、函數(shù)、方法 |
允許用戶執(zhí)行包和例程。 |
ALTERIN |
模式 |
允許用戶修改模式中的對(duì)象定義。 |
CREATEIN |
模式 |
允許用戶在模式中創(chuàng)建對(duì)象。 |
DROPIN |
模式 |
允許用戶刪除模式中的對(duì)象。 |
關(guān)于對(duì)象級(jí)特權(quán)的信息存儲(chǔ)在系統(tǒng)編目視圖中。視圖名稱是 syscat.tabauth、syscat.colauth、syscat.indexauth、syscat.schemaauth、syscat.routineauth 和 syscat.packageauth。
顯式特權(quán)
可以使用 GRANT 和 REVOKE 命令 顯式地 對(duì)用戶或組授予或撤消特權(quán)。我們來看看如何在各種對(duì)象上使用這些命令。
作為擁有 Administrator 權(quán)限的用戶登錄 Windows,打開兩個(gè) DB2 命令窗口。在這兩個(gè)窗口中,確保將 db2instance 變量設(shè)置為 DB2!
在第一個(gè)窗口中發(fā)出以下命?¤:
db2 connect to sample |
現(xiàn)在,在第二個(gè)窗口中發(fā)出以下命令:
db2 connect to sample user test1 using password |
請(qǐng)記住,第一個(gè)窗口中的命令是由一個(gè)擁有 SYSADM 權(quán)限的用戶發(fā)出的。第二個(gè)窗口中的命令是由
tst1
發(fā)出的,這個(gè)用戶對(duì)示例數(shù)據(jù)庫沒有特殊的權(quán)限或特權(quán)。注意,與示例數(shù)據(jù)庫中的表相關(guān)聯(lián)的模式名是發(fā)出 db2sampl 命令的用戶的名稱。在這些示例中,這個(gè)用戶是
GMILNE
。
現(xiàn)在,在第二個(gè)窗口中發(fā)出以下命令:
db2 select * from gmilne.org |
應(yīng)該會(huì)看到以下響應(yīng):
SQL0551N "TEST1" does not have the privilege to perform operation "SELECT" on object "GMILNE.ORG". |
?
為了糾正這種狀況,在第一個(gè)窗口中發(fā)出以下命令:
db2 grant select on table gmilne.org to user test1 |
現(xiàn)在,前面的命令就會(huì)成功!接下來,在第二個(gè)窗口中發(fā)出一個(gè)更復(fù)雜的命令:
db2 insert into gmilne.org values (100, 'Tutorial', 1, 'Eastern', 'Toronto') |
同樣會(huì)看到錯(cuò)誤消息:
SQL0551N "TEST1" does not have the privilege to perform operation "INSERT" on object "GMILNE.ORG" |
?
所以,在第一個(gè)窗口中輸入以下命令:
db2 grant insert on table gmilne.org to group db2grp1 |
?
原來失敗的 INSERT 命令現(xiàn)在應(yīng)該會(huì)成功完成,因?yàn)? test1 是 db2grp1 組的成員。
現(xiàn)在,在第二個(gè)窗口中輸入以下命令:
db2 drop table gmilne.emp_photo |
?
同樣會(huì)看到錯(cuò)誤消息:
SQL0551N "TEST1" does not have the privilege to perform operation "DROP TABLE" on object "GMILNE.EMP_PHOTO". |
?
所以,我們要授予這個(gè)特權(quán)。在第一個(gè)窗口中輸入以下命令:
db2 grant dropin on schema gmilne to all |
DROP TABLE 命令現(xiàn)在應(yīng)該會(huì)成功完成。
既然已經(jīng)完成了示例,就可以撤消剛才授予的特權(quán)。在第一個(gè)窗口中發(fā)出以下命令:
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 |
注意,從組中撤消特權(quán)不一定會(huì)從這個(gè)組的所有成員撤消它。例如,以下命令可以用來從
db2grp1
撤消對(duì) gmilne.org 表的所有特權(quán)(CONTROL 除外):
db2 revoke all on table gmilne.org from group db2grp1 |
但是,
test1
用戶(他是
db2grp1
的成員)仍然擁有對(duì)這個(gè)表的選擇特權(quán),因?yàn)樗蛩潜恢苯邮谟柽@個(gè)特權(quán)的。
隱式特權(quán)
當(dāng)發(fā)出某些命令時(shí),DB2 可能會(huì)自動(dòng)地授予特權(quán),而不需要像前面看到的那樣發(fā)出顯式的 GRANT 語句。下表總結(jié)了會(huì)導(dǎo)致數(shù)據(jù)庫管理程序隱式地授予特權(quán)的一些命令。注意,當(dāng)刪除創(chuàng)建的對(duì)象時(shí),這些特性會(huì)隱式地撤消。但是,當(dāng)顯式地撤消更高級(jí)的特權(quán)時(shí),不會(huì)撤消它們。
發(fā)出的命令 |
授予的特權(quán) |
被授予特權(quán)的用戶 |
CREATE TABLE mytable |
mytable 上的 CONTROL |
發(fā)出命令的用戶 |
CREATE SCHEMA myschema |
myschema 上的 CREATEIN、ALTERIN 和 DROPIN,以及將這些特權(quán)授予其他用戶的能力 |
發(fā)出命令的用戶 |
CREATE VIEW myview |
myview 上的 CONTROL(只有在用戶擁有 myview 定義中引用的所有表和視圖上的 CONTROL 特權(quán)的情況下) |
發(fā)出命令的用戶 |
CREATE DATABASE mydb |
mydb 的系統(tǒng)編目表上的 SELECT,mydb 上的 IMPLICIT_SCHEMA * |
PUBLIC** |
*當(dāng)用戶創(chuàng)建數(shù)據(jù)庫時(shí),隱式地授予這個(gè)用戶這個(gè)數(shù)據(jù)庫上的 DBADM 權(quán)限。獲得 DBADM 權(quán)限就會(huì)隱式地授予 CONNECT、CREATETAB、BINDADD、IMPLICIT_SCHEMA 和 CREATE_NOT_FENCED 特權(quán)。即使撤消了 DBADM 權(quán)限,這個(gè)用戶仍然會(huì)保留這些特權(quán)。
**PUBLIC 是一個(gè)特殊的 DB2 組,其中包括特定數(shù)據(jù)庫的所有用戶。與前面討論過的其他組不同,PUBLIC 不必在操作系統(tǒng)級(jí)進(jìn)行定義。在默認(rèn)情況下,會(huì)向 PUBLIC 授予一些特權(quán)。例如,這個(gè)組自動(dòng)接受數(shù)據(jù)庫上的 CONNECT 特權(quán)和編目表上的 SELECT 特權(quán)。可以對(duì) PUBLIC 組發(fā)出 GRANT 和 REVOKE 命令,比如:
db2 grant select on table sysibm.systables to public db2 revoke select on table sysibm.systables from public |
間接特權(quán)
當(dāng)數(shù)據(jù)庫管理器執(zhí)行 包 時(shí),可以間接獲得特權(quán)。包中包含一個(gè)或多個(gè) SQL 語句,這些語句已經(jīng)轉(zhuǎn)換為 DB2 用來在內(nèi)部執(zhí)行它們的格式。換句話說,包中包含可執(zhí)行格式的多個(gè) SQL 語句。如果包中的所有語句都是靜態(tài)的,那么用戶只需要有包上的 EXECUTE 特權(quán),就能夠成功地執(zhí)行包中的語句。
例如,假設(shè) db2package1 執(zhí)行以下靜態(tài)的 SQL 語句:
db2 select * from orgdb2 insert into test values (1, 2, 3) |
?
在這種情況下,擁有 db2package1 上的 EXECUTE 特權(quán)的用戶會(huì)間接地獲得 org 表上的 SELECT 特權(quán)和 test 表上的 INSERT 特權(quán)。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
