1、創建系統用戶dbuser/ehong隸屬于db2users???
2、C:\Program Files\IBM\SQLLIB\BIN>db2 connect to AKZXTEST
數據庫連接信息
?數據庫服務器???????? = DB2/NT 9.7.3
?SQL 授權標識???????? = ADMINIST...
?本地數據庫別名?????? = AKZXTEST
3、給用戶授權
授予連接權限
C:\Program Files\IBM\SQLLIB\BIN>db2 grant
connect
on database to user dbuser
DB20000I? SQL 命令成功完成。?
這里可以授予的數據庫級特權有:
CREATETAB: 用戶可以在數據庫中創建表。
BINDADD: 用戶可以使用 BIND 命令在數據庫中創建包。
CONNECT: 用戶可以連接數據庫。
CREATE_NOT_FENCED: 用戶可以創建 unfenced 用戶定義函數(UDF)。
IMPLICIT_SCHEMA: 用戶可以在數據庫中隱式地創建模式,而不需要使用 CREATE SCHEMA 命令。
LOAD: 用戶可以將數據裝載進表中。
QUIESCE_CONNECT: 用戶可以訪問處于靜默(quiesced)狀態的數據庫。
CREATE_EXTERNAL_ROUTINE: 用戶可以創建供應用程序和數據庫的其他用戶使用的過程。
secadm:安全性管理員
Dbadm:DBADM?用戶對一個數據庫有幾乎完全的控制能力。DBADM?用戶不能執行某些維護或管理任務
4、測試連接
C:\Program Files\IBM\SQLLIB\BIN>db2 connect to AKZXTEST user dbuser? using ehong
數據庫連接信息
?數據庫服務器???????? = DB2/NT 9.7.3
?SQL 授權標識???????? = DBUSER
?本地數據庫別名?????? = AKZXTEST
###############################################
db2 數據庫特權大體上分成兩類:數據庫級特權(針對數據庫中的所有對象)和對象級特權(與特定的對象相關聯)。
1、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?用戶能夠發出這個命令。
2、?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?權限如何允許我們的用戶使用?LOAD?命令將數據裝載進?sales?表中。假設已經發出了命令?db2?connect?to?sample。
*?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。?
3.其他特權
用戶可以擁有的數據庫級特權有:
*?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?模式?允許用戶刪除模式中的對象。
關于對象級特權的信息存儲在系統編目視圖中。視圖名稱是?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 授權的研究 ###################################################
DB2 中有三種主要的安全機制,可以幫助 DBA 實現數據庫安全計劃: 身份驗證( authentication ) 、 授權( authorization ) 和 特權( privilege ) 。
身份驗證是用戶在嘗試訪問 DB2 實例或數據庫時遇到的第一種安全特性。DB2 身份驗證與底層操作系統的安全特性緊密協作來檢驗用戶 ID 和密碼。DB2 還可以利用 Kerberos 這樣的安全協議對用戶進行身份驗證。
授權決定用戶和/或用戶組可以執行的操作以及他們可以訪問的數據對象。用戶執行高級數據庫和實例管理操作的能力由指派給他們的權限決定。在 DB2 中有 5 種不同的權限級別:SYSADM、SYSCTRL、SYSMAINT、DBADM 和 LOAD。
特權的粒度比授權要細,可以分配給用戶和/或用戶組。特權定義用戶可以創建或刪除的對象。它們還定義用戶可以用來訪問對象(比如表、視圖、索引和包)的命令。DB2 9 中新增的一個概念是基于標簽的訪問控制(LBAC),它允許以更細的粒度控制誰有權訪問單獨的行和/或列。
1.DB2身份驗證
DB2 使用 身份驗證類型 決定在什么地方進行身份驗證。例如,在客戶機 - 服務器環境中,是客戶機還是服務器檢驗用戶的 ID 和密碼?在客戶機 - 網關 - 主機環境中,是客戶機還是主機檢驗用戶的 ID 和密碼? 可以在DBM CFG中指定相應的驗證類型:
DB2 GET DBM CFG
Server Connection Authentication????????? (SRVCON_AUTH) = KERBEROS
Database manager authentication??????? (AUTHENTICATION) = SERVER_ENCRYPT
那么在連接實例時會使用 SERVER_ENCRYPT。但是在連接數據庫時會使用 KERBEROS 身份驗證。
在客戶機 - 網關 - 主機環境中,這些身份驗證選項在客戶機和網關上設置,而不是在主機上。
類型 |
描述 |
SERVER |
身份驗證在服務器上進行。 |
SERVER_ENCRYPT |
身份驗證在服務器上進行。密碼在客戶機上進行加密,然后再發送到服務器。 |
CLIENT |
身份驗證在客戶機上進行. |
*KERBEROS |
由 Kerberos 安全軟件執行身份驗證。 |
*KRB_SERVER_ENCRYPT |
如果客戶機設置是 KERBEROS,那么由 Kerberos 安全軟件執行身份驗證。否則使用 SERVER_ENCRYPT。 |
DATA_ENCRYPT |
身份驗證在服務器上進行。服務器接受加密的用戶 ID 和密碼,并對數據進行加密。這個選項的操作方式與 SERVER_ENCRYPT 相同,但是數據也要加密。 |
DATA_ENCRYPT_CMP |
身份驗證方式與 DATA_ENCRYPT 相同,但是允許不支持 DATA_ENCRYPT 的老式客戶機使用 SERVER_ENCRYPT 身份驗證進行連接。在這種情況下,數據不進行加密。如果進行連接的客戶機支持 DATA_ENCRYPT,就會進行數據加密,而不能降級到 SERVER_ENCRYPT 身份驗證。這個身份驗證類型只在服務器的數據庫管理程序配置文件中是有效的,而且在客戶機或網關實例上使用 CATALOG DATABASE 時是無效的。 |
GSSPLUGIN |
身份驗證方式由一個外部 GSS-API 插件決定。 |
GSS_SERVER_ENCRYPT |
身份驗證方式由一個外部 GSS-API 插件決定。在客戶機不支持服務器的 GSS-API 插件之一的情況下,使用 SERVER_ENCRYPT 身份驗證。 |
2.授權
授權由特權組和高級數據庫管理程序(實例級)維護和實用操作組成。在 DB2 可用的 5 種權限中,SYSADM、SYSCTRL 和 SYSMAINT 是 實例級權限 。這意味著它們的范圍包含實例級命令以及針對這個實例中的所有數據庫的命令。這些權限只能分配給組;可以通過 DBM CFG 文件分配這些權限。
針對特定數據庫的 DBADM 和 LOAD 權限可以分配給用戶或用戶組。可以使用 GRANT 命令顯式地分配這些權限。
獲得 SYSADM 權限
SYSADM 權限由 DBM CFG 文件中的 SYSADM_GROUP 參數控制。在 Windows 上,在創建實例時,這個參數設置為 Administrator(但是,如果發出命令 db2 get dbm cfg,它看起來是空的)。在 UNIX 上,它設置為創建這個實例的用戶的主組。
因為只允許 SYSADM 用戶更新 DBM CFG 文件,所以只有他們能夠向其他組授予任何 SYS* 權限。以下示例演示如何向 db2grp1 組授予 SYSADM 權限:
db2 update dbm cfg using SYSADM_GROUP db2grp1 |
獲得 SYSCTRL 權限
擁有 SYSCTRL 權限的用戶可以在實例中執行所有管理和維護命令。但是,與 SYSADM 用戶不同,他們不能訪問數據庫中的任何數據,除非他們被授予了訪問數據所需的特權。SYSCTRL 用戶可以對實例中的任何數據庫執行的命令示例如下:
db2start/db2stopdb2 create/drop databasedb2 create/drop tablespacedb2 backup/restore/rollforward databasedb2 runstats(針對任何表) db2 update db cfg for database dbname
擁有 SYSADM 權限的用戶可以使用以下命令將 SYSCTRL 分配給一個組:
db2 update dbm cfg using SYSCTRL_GROUP group name |
?
? |
獲得
SYSMAINT
權限
擁有 SYSMAINT 權限的用戶可以發出的命令是擁有 SYSCTRL 權限的用戶可以發出的命令的子集。SYSMAINT 用戶只能執行與維護相關的任務,比如:
db2start/db2stopdb2 backup/restore/rollforward databasedb2 runstats(針對任何表) db2 update db cfg for database dbname
注意,擁有 SYSMAINT 權限的用戶不能創建或刪除數據庫或表空間。他們也不能訪問數據庫中的任何數據,除非他們被顯式地授予訪問數據所需的特權。
如果您擁有 SYSADM 權限,那么可以使用以下命令將 SYSMAINT 權限分配給一個組:
db2 update dbm cfg using SYSMAINT_GROUP group name |
獲得
DBADM
權限
DBADM 權限是一個數據庫級權限,而不是實例級權限。DBADM 用戶對一個數據庫有幾乎完全的控制能力。DBADM 用戶不能執行某些維護或管理任務,比如:
drop databasedrop/create tablespacebackup/restore databaseupdate db cfg for database db name
但是,他們可以執行以下任務:
db2 create/drop tabledb2 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 tabledb2 list tablespacesdb2 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 權限如何允許我們的用戶使用 LOAD 命令將數據裝載進 sales 表中。假設已經發出了命令 db2 connect to sample。
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。?
3.特權
用戶可以擁有的數據庫級特權有:
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 |
模式 |
允許用戶刪除模式中的對象。 |
關于對象級特權的信息存儲在系統編目視圖中。視圖名稱是 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 orgdb2 insert into test values (1, 2, 3) |
?
在這種情況下,擁有 db2package1 上的 EXECUTE 特權的用戶會間接地獲得 org 表上的 SELECT 特權和 test 表上的 INSERT 特權。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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