/*
DB2 9 提供一組還蠻好用的 Procedures,
可以將指定的 source schema 下所有物件(還是有限制),複製到指定的 target schema 下
也可以刪除指定 schema 下所有物件(我相信還是有限制的, 這部份待測)
*/
-- 前置作業(create users、create table、view、mqt 及 insert 資料)
「電腦管理」-> 「本機使用者和群組」-> 「使用者」 點選 「新使用者」
分別建立使用者 db2admin、dba。
-- 以使用者 db2admin 登進 db2
C:\>db2 create table t1 ( col1 integer,col2 varchar(32) ) in userspace1
DB20000I SQL 指令已順利完成。
C:\>db2 insert into t1 values (1,'abc'),(2,'xxx')
DB20000I SQL 指令已順利完成。
C:\>db2 create view v_t1 as select * from t1
DB20000I SQL 指令已順利完成。
-- 測試包含其它 schema 物件的 view 是否亦可被複製
C:\>db2 create view v_ap as select * from administrator.ap
DB20000I SQL 指令已順利完成。
C:\>db2 create table mqt_t1 as ( select * from t1 ) data initially deferred refresh deferred in userspace1
DB20000I SQL 指令已順利完成。
C:\>db2 refresh table mqt_t1
DB20000I SQL 指令已順利完成。
C:\>db2 terminate
DB20000I TERMINATE 指令已順利完成。
-- 檢查 db2admin 權限(必須要有 DBADM 權限)
C:\>db2 get authorizations
現行使用者的管理權限
直接 SYSADM 權限 = NO
直接 SYSCTRL 權限 = NO
直接 SYSMAINT 權限 = NO
直接 DBADM 權限 = NO
‧
‧
‧
-- 以最高權限登入, 將 DBADM 權限授與 db2admin (若不授與,則以下複製schema的部份改以擁有 DBADM 權限的 USER 來執行亦可)
C:\>db2 grant dbadm on database to user db2admin
DB20000I SQL 指令已順利完成。
-- 再回到 db2admin user
C:\>db2 get authorizations
現行使用者的管理權限
直接 SYSADM 權限 = NO
直接 SYSCTRL 權限 = NO
直接 SYSMAINT 權限 = NO
直接 DBADM 權限 = YES
‧
‧
‧
-- 執行 SYSPROC.ADMIN_COPY_SCHEMA 將物件複製至 USER DBA
-- 第三個參數是複製模式,可選 DLL(只有Layout)或 COPY(含資料) 或 COPYNO(CREATE & LOAD)
-- 第四個參數是OWNER, 給定為NULL的話, 只有ADMINISTRATOR有專用權.
-- 以DBA登入做SELECT 會因為有專用權而發生以下錯誤
-- SQL0551N "DBA" 沒有在物件 "DBA.T1" 上執行作業 "SELECT" 的必要授權或專用權。
-- SQLSTATE=42501
-- 最後兩個則為產生錯誤時, 自動會建於TABLESPACE:SYSTOOLSPACE下的 ERRSCHEMA.ERRTAB
C:\>db2 CALL sysproc.admin_copy_schema('DB2ADMIN','DBA','COPY','DBA','USERSPACE1','USERSPACE1','ERRSCHEMA','ERRTAB')
輸出參數的值
--------------------------
參數名稱:ERRORTABSCHEMA
參數值: -
參數名稱:ERRORTABNAME
參數值: -
傳回狀態 = 0
-- 以 USER DBA 登入檢查建立的物件
C:\>db2 select name,type,creator from sysibm.systables where creator = 'DBA'
NAME TYPE CREATOR
---------- ------ -----------
MQT_T1 S DBA
T1 T DBA
V_AP V DBA
V_T1 V DBA
已選取 4 個記錄。
-- 若必須將整個SCHEMA下的物件做刪除則可執行
C:\>db2 call sysproc.admin_drop_schema('DBA',NULL,'ERRSCHEMA','ERRTAB')
輸出參數的值
--------------------------
參數名稱:ERRORTABSCHEMA
參數值: -
參數名稱:ERRORTAB
參數值: -
傳回狀態 = 0