/*
1) 使用 DB2 9 的新功能建立 ROLE
2) 建立測試 user: TestingUser
3) grant ROLE to TestingUser
4) 由 system table/view 檢視 TestingUser 的權限
*/
/* 1)create role
以 db administrator 登錄,將安全管理員角色(secadm)授予User Orion
*/
C:\>db2 connect to sample user db2admin using db2admin
資料庫連線資訊
資料庫伺服器 = DB2/NT 9.5.0
SQL 授權 ID = DB2ADMIN
本地資料庫別名 = SAMPLE
C:\>db2 grant secadm on database to user orion
DB20000I SQL 指令已順利完成。
/* ※ 否則直接以未授予secadm角色的user orion create role 會出現以下錯誤:
DB21034E 指令被當作 SQL 陳述式處理,因為他不是有效的「指令行處理器」指令。 在SQL 處理程序期間,他已傳回:
SQL0552N "ORION" 沒有執行作業 "CREATE ROLE" 的專用權。 SQLSTATE=42502
*/
/* 以orion登錄 */
C:\>db2 connect to sample
資料庫連線資訊
資料庫伺服器 = DB2/NT 9.5.0
SQL 授權 ID = ORION
本地資料庫別名 = SAMPLE
C:\>db2 create role role_o
DB20000I SQL 指令已順利完成。
C:\>db2 grant all on table department to role role_o
DB20000I SQL 指令已順利完成。
/* 2)建立測試 user: TestingUser
使用「控制台」→「使用者帳戶」建立新的帳戶
db2 不像 oracle
db2 沒有create/drop user、或設定password,完全交由 os 來管理
*/

/* 3) grant ROLE to TestingUser */
C:\>db2 grant role_o to user TestingUser
DB20000I SQL 指令已順利完成。
/* 4) 由 system table/view 檢視 TestingUser 的權限 */
C:\>db2 connect to sample user TestingUser using testinguser
資料庫連線資訊
資料庫伺服器 = DB2/NT 9.5.0
SQL 授權 ID = TESTINGU...
本地資料庫別名 = SAMPLE
C:\>db2 select rolename from syscat.roleauth where grantee = 'TESTINGUSER'
ROLENAME
-----------------
ROLE_O
已選取 1 個記錄。
C:\>db2 select privilege,grantable,substr(objectname,1,16), \
db2 (續) => => substr(objectschema,1,16),substr(objecttype,1,10), \
db2 (續) => => substr(grantee,1,16) from sysibmadm.privileges, \
db2 (續) => => syscat.roleauth where authid = 'ROLE_O' \
db2 (續) => => and authid = rolename
PRIVILEGE GRANTABLE 3 4 5 6
----------- --------- ---------- ------ ------- ------------
UPDATE N DEPARTMENT ORION TABLE TESTINGUSER
REFERENCE N DEPARTMENT ORION TABLE TESTINGUSER
SELECT N DEPARTMENT ORION TABLE TESTINGUSER
INSERT N DEPARTMENT ORION TABLE TESTINGUSER
INDEX N DEPARTMENT ORION TABLE TESTINGUSER
DELETE N DEPARTMENT ORION TABLE TESTINGUSER
ALTER N DEPARTMENT ORION TABLE TESTINGUSER
已選取 7 個記錄。