顯示具有 DB2 - Admin 標籤的文章。 顯示所有文章
顯示具有 DB2 - Admin 標籤的文章。 顯示所有文章

2009年8月5日 星期三

DB2 Express-C 9.7 GUI Chinese characters does not show properly


/*
  DB2 Express-C 9.7安裝後 GUI 的 menu 字體成了亂碼
  本來以為會是\IBM\SQLLIB\java\jdk\jre\lib下的fontconfig.properties.src有關
  結果,內容被我改得面目全非卻還是不見效...
  沒想到原來解法是這麼簡單
*/


/* 
 控制中心等GUI字體設定


 Reference: IBM DB2 控制中心等圖形工具在 Windows 下的字體設置
 http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0703caojx/


 點選「工具設定」後,選擇「字型」,接著
 將「功能表(M)」的字型下拉式選單設為對話,
 關閉控制中心,接著再開起即可
*/





/* 
 配置輔助程式GUI中文字體無法正常顯示


 Reference:IZ01055: DB2 MESSAGE WINDOW DOES NOT SHOW SOME OF THE
      CHINESE CHARACTERS PROPERLY
      WHEN CONFIGURATION ASSISTANT IS OPENED AS 'DB2CA'.
 http://www-01.ibm.com/support/docview.wss?uid=swg1IZ01055

 把\IBM\SQLLIB\bin\下的db2ca.bat先做個備份,接著再用以下內容取代即可

*/



set RUNTIME_FLAGS=-Xmx128m -Xms8m -Xquickstart -Xgcpolicy:optavgpause

IF "%1" == "wait" GOTO WAIT
IF "%1" == "-ic" GOTO WSWB
 db2javit -j:CC -s: -i: -l: -o:"%RUNTIME_FLAGS%" -a:"-ca %2 %3 %4 %5 %6 %7 %8"
 GOTO END

:WAIT
 db2javit -j:CC -s: -w: -i: -l: -o:"%RUNTIME_FLAGS%" -a:"-ca %3 %4 %5 %6 %7 %8 %9"
 GOTO END

:WSWB
 db2icdocs.exe
 GOTO END

:end

2009年8月4日 星期二

Grant Load authority using DB2 Express-C 9.7


/*
  好不容易終於拿到 DB2 Express-C 9.7
  灌好之後才發現原來它是這麼令人陌生...(是我假放太久了嗎?)
  一是控制中心的選單字體全成了亂碼,二是權限異動頗大
  到現在還是搞不清楚。不過先把弄出來的做一下紀錄...

  在什麼都沒設定之下執行 load,就會有以下錯誤:
  SQL0552N "ADMINISTRATOR" 沒有執行作業 "LOAD" 的專用權。 SQLSTATE=42502

  原來 LOAD 權限已經不再是預設就有的,因此權限設定上還真麻煩,
  特別是我只是單純用本機的 Administrator 去做測試
*/


/* 檢查本機使用者和群組設定 */

「開始」→「程式集」→「系統管理工具」→「電腦管理」
展開「系統工具」接著再展開「本機使用者和群組」
點選「群組」。檢查是否存在名稱為 DB2ADMNS 的群組。
再點選「使用者」。將 Administrator 「成員隸屬」的選單新增DB2ADMNS群組。


/* 建自己的 DB */

不使用「DB2安裝」所建立的DB:SAMPLE,原因是,
我還沒Try出來到底怎麼使Administrator有執行grant的專用權。
另外我也還沒辦法用localsystem account去logon。

如果我要Administrator有SECADM (Manages security within a database)的權限,
目前所能做的就是使 Administrator 成為 db 的 creator。


C:\>db2start
SQL1063N DB2START 處理成功。

C:\>db2 create database orion
DB20000I CREATE DATABASE 指令已順利完成。


C:\>db2 connect to orion

  資料庫連線資訊

 資料庫伺服器      = DB2/NT 9.7.0
 SQL 授權 ID       = ADMINIST...
 本端資料庫別名     = ORION


/* 檢查有哪些權限 */
C:\>db2 get authorizations



  現行使用者的管理權限

 直接 SYSADM 權限       = NO
 直接 SYSCTRL 權限       = NO
 直接 SYSMAINT 權限      = NO
 直接 DBADM 權限        = YES
 直接 CREATETAB 權限      = NO
 直接 BINDADD 權限       = NO
 直接 CONNECT 權限       = NO
 直接 CREATE_NOT_FENC 權限  = NO
 直接 IMPLICIT_SCHEMA 權限   = NO
 直接 LOAD 權限         = NO
 直接 QUIESCE_CONNECT 權限    = NO
 直接 CREATE_EXTERNAL_ROUTINE 權限 = NO
 直接 SYSMON 權限          = NO

 間接 SYSADM 權限        = NO
 間接 SYSCTRL 權限        = YES
 間接 SYSMAINT 權限       = YES
 間接 DBADM 權限        = NO
 間接 CREATETAB 權限      = YES
 間接 BINDADD 權限       = YES
 間接 CONNECT 權限       = YES
 間接 CREATE_NOT_FENC 權限   = NO
 間接 IMPLICIT_SCHEMA 權限   = YES
 間接 LOAD 權限         = NO
 間接 QUIESCE_CONNECT 權限   = NO
 間接 CREATE_EXTERNAL_ROUTINE 權限 = NO
 間接 SYSMON 權限          = YES


/* 自己不能grant自己 */
C:\>db2 grant load on database to administrator
DB21034E 指令被當作 SQL 陳述式處理,因為它不是有效的「指令行處理器」指令。
在SQL 處理程序期間,它已傳回:
SQL0554N 授權 ID 無法授與自身專用權或權限。 SQLSTATE=42502

/* grant權限給群組 */

C:\>db2 grant load on database to db2admns
DB20000I SQL 指令已順利完成。

C:\>db2 create table t1 (c1 integer)
DB20000I SQL 指令已順利完成。

/* 再檢查一下權限 */

C:\>db2 get authorizations

  現行使用者的管理權限

 直接 SYSADM 權限       = NO
 直接 SYSCTRL 權限       = NO
 直接 SYSMAINT 權限      = NO
 直接 DBADM 權限        = YES
 直接 CREATETAB 權限      = NO
 直接 BINDADD 權限       = NO
 直接 CONNECT 權限       = NO
 直接 CREATE_NOT_FENC 權限  = NO
 直接 IMPLICIT_SCHEMA 權限   = NO
 直接 LOAD 權限         = NO
 直接 QUIESCE_CONNECT 權限    = NO
 直接 CREATE_EXTERNAL_ROUTINE 權限 = NO
 直接 SYSMON 權限          = NO

 間接 SYSADM 權限        = NO
 間接 SYSCTRL 權限       = YES
 間接 SYSMAINT 權限      = YES
 間接 DBADM 權限        = NO
 間接 CREATETAB 權限     = YES
 間接 BINDADD 權限      = YES
 間接 CONNECT 權限       = YES
 間接 CREATE_NOT_FENC 權限   = NO
 間接 IMPLICIT_SCHEMA 權限   = YES

 間接 LOAD 權限          = YES

 間接 QUIESCE_CONNECT 權限     = NO
 間接 CREATE_EXTERNAL_ROUTINE 權限 = NO
 間接 SYSMON 權限          = YES


/* 測試load */

C:\>db2 load from t1.del of del insert into t1
SQL3501W 由於禁止資料庫向前回復, 所以表格常駐的表格空間將不放入備份懸置狀態。

SQL3109N 公用程式開始自檔案 "C:\t1.del" 載入資料。

SQL3500W 公用程式在 "2009-08-04 20:27:16.489660" 時開始 "LOAD" 階段。

SQL3519W 開始載入「一致點」。輸入記錄數 = "0"。

SQL3520W 成功載入「一致點」。

SQL3110N 公用程式已完成處理。自輸入檔讀取第 "1" 列。

SQL3519W 開始載入「一致點」。輸入記錄數 = "1"。

SQL3520W 成功載入「一致點」。

SQL3515W 公用程式已在 "2009-08-04 20:27:16.700221" 時完成 "LOAD" 階段。

已讀取的列數        = 1
已略過的列數        = 0
已載入的列數        = 1
已拒絕的列數        = 0
已拒絕的列數        = 0
已確定的列數        = 1

2008年11月13日 星期四

Create Role using DB2 9


/*
  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 個記錄。

2008年9月2日 星期二

can't find db2diag.log - DB2 Express-C v9.5


安裝好 DB2 Express-C v9.5 之後,我發現在 Program File\IBM\SQLLIB\ 下的資料夾數目好像少了點。
心想反正是新的版本,多多少少也做了些修改,因此沒再細查。
今天突然想檢查一下 db2diag.log,看看安裝後的這幾天裡,DB 有沒有什麼錯誤訊息。才發現以往那個有instance name的路徑居然不見了?
就上了 IBM 官網去 download Freebook:GettingStartedwithDB2Express-C_V95-en.pdf

找了db2diag.log的部份,明明就是這樣寫著:

On Windows, the db2diag.log is located by default under th directory:

C:\Program Files\IBM\sqllib\< instance name >\db2diag.log

ㄟ... 可是,我怎麼就是沒有這個 instance name 是 DB2 的路徑呢?

搞半天,原來是死到 C:\Documents and Settings\All Users\Application Data\IBM\DB2\DB2COPY1 這裡去了~



--先檢查一下DIAGPATH的設定值

C:\>db2 get dbm cfg

         資料庫管理程式配置

   節點類型 = 具有本地及遠端用戶端的資料庫伺服器

 資料庫管理程式配置版次             = 0x0c00

 開啟檔案的最大總數       (MAXTOTFILOP) = 16000
 CPU 速度 (千分之一秒/指令)   (CPUSPEED) = 3.345772e-007

 並行作用中資料庫的最大數目        (NUMDB) = 8
 聯合資料庫系統支援          (FEDERATED) = NO
 交易處理器監視器名稱         (TP_MON_NAME) =

 預設記帳帳戶             (DFT_ACCOUNT_STR) =

 Java Development Kit 安裝路徑  (JDK_PATH) = C:\Program Files\IBM\SQLLIB\java\jdk

 診斷錯誤擷取層次          (DIAGLEVEL) = 3
 通知層次              (NOTIFYLEVEL) = 3
 診斷資料目錄路徑          (DIAGPATH) =

 預設資料庫監視器開關
  緩衝池              (DFT_MON_BUFPOOL) = OFF
  ‧
  ‧
  ‧
  ‧

-- DIAGPATH沒設定,再去看DB2INSTPROF

C:\>db2set -all

[i] DB2INSTPROF=C:\Documents and Settings\All Users\Application Data\IBM\DB2\DB2COPY1

-- 果然就在這個地方找到我要的db2diag.log,真機車~

2008年7月3日 星期四

SQL0964C Error using DB2 UDB8.2

/*
  將SRC_CUSTOMER.B 更新至 CUSTOMER的.B
  MATCH條件:SRC_CUSTOMER.A = CUSTOMER.A

  將以下MERGE語法存成.sql ex:notlogged.sql
*/


MERGE  INTO CUSTOMER
USING  SRC_CUSTOMER ON SRC_CUSTOMER.A = CUSTOMER.A
WHEN   MATCHED THEN
UPDATE  SET CUSTOMER.B = SRC_CUSTOMER.B;

--執行並得到以下錯誤訊息

C:\>db2 -tf notlogged.sql

DB21034E 命令被當作 SQL 陳述式處理,因為它不是有效的「命令行處理器」命令。
在SQL 處理程序期間,它已傳回:
SQL0964C 資料庫的交易日誌已滿。 SQLSTATE=57011

--ALTER TABLE 使其不寫LOG

C:\>DB2 ALTER TABLE CUSTOMER ACTIVATE NOT LOGGED INITIALLY

--再執行一次MERGE仍發生SQL0964C錯誤

--解決方法:
--(1)直接修改db環境變數DB2OPTIONS=+c (取消AUTO-COMMIT)

C:\>DB2SET DB2OPTIONS=+c
C:\>DB2 ALTER TABLE CUSTOMER ACTIVATE NOT LOGGED INITIALLY
C:\>db2 -tf notlogged.sql
C:\>DB2 COMMIT
C:\>DB2SET DB2OPTIONS=-c

--(2)只在執行SQL中取消AUTO-COMMIT
--編輯一下notlogged.sql,內容如下:
-- 將AUTO-COMMIT取消

UPDATE COMMAND OPTIONS USING C OFF;

ALTER TABLE CUSTOMER ACTIVATE NOT LOGGED INITIALLY;

MERGE  INTO CUSTOMER
USING  SRC_CUSTOMER ON SRC_CUSTOMER.A = CUSTOMER.A
WHEN   MATCHED THEN
UPDATE  SET CUSTOMER.B = SRC_CUSTOMER.B;

COMMIT;

UPDATE COMMAND OPTIONS USING C ON;

執行notlogged.sql

C:\>db2 -tf notlogged.sql

--※ Procedure 的用法
--Procedure: sp_test,內容如下:

CREATE PROCEDURE SP_TEST
SPECIFIC SP_TEST
LANGUAGE SQL
BEGIN

   DECLARE SQLCODE INTEGER DEFAULT 0;
   DECLARE retcode INTEGER DEFAULT 0;
   DECLARE szSql VARCHAR(128);

   DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND
   SET retcode = SQLCODE;

   SET szSql = 'ALTER TABLE CUSTOMER ACTIVATE NOT LOGGED INITIALLY';
   EXECUTE IMMEDIATE szSql;

   MERGE  INTO CUSTOMER
   USING  SRC_CUSTOMER ON SRC_CUSTOMER.A = CUSTOMER.A
   WHEN   MATCHED THEN
   UPDATE  SET CUSTOMER.B = SRC_CUSTOMER.B;

   IF (retcode <> 0) AND (retcode <> 100) THEN
     ROLLBACK;
     RETURN retcode;
   END IF;
   COMMIT;
   RETURN retcode;
END

--執行procedure

C:\>db2 call sp_test

  傳回狀態=0

2008年6月27日 星期五

SQL30081 Error when connect using DB2 UDB8.2

/* Connect DB時傳回以下錯誤 */

C:\>connect to ORIONDB user db2admin using db2admin

SQL30081N 偵測到通信錯誤。 已使用的通訊協定: "TCP/IP"。 已使用的通信 API:
"SOCKETS"。 偵測到錯誤的位置: "10.7.72.62"。
偵測錯誤的通信功能:"connect"。 通訊協定特定的錯誤碼: "10060"、"*"、"*"。
SQLSTATE=08001

/* 解決方法 */
/* 1) Check database server 的環境變數 DB2COMM是否設為TCPIP */

C:\>db2set -all
[e] DB2PATH=C:\Program Files\IBM\SQLLIB
[i] DB2ACCOUNTNAME=IBM-63AB93AA2BF\orion
[i] DB2INSTOWNER=IBM-63AB93AA2BF
[i] DB2PORTRANGE=60000:60003
[i] DB2INSTPROF=C:\PROGRAM FILES\IBM\SQLLIB
[i] DB2COMM=TCPIP
[g] DB2_EXTSECURITY=YES
[g] DB2SYSTEM=IBM-63AB93AA2BF
[g] DB2PATH=C:\Program Files\IBM\SQLLIB
[g] DB2INSTDEF=DB2
[g] DB2ADMINSERVER=DB2DAS00

/* 使用db2set設定 */

C:\>db2set DB2COMM = TCPIP

/* 2) 檢查 database server的service name */

C:\>DB2 GET DBM CFG

資料庫管理程式配置

   節點類型 = 具有本地及遠端用戶端的 Enterprise Server Edition

 資料庫管理程式配置版次               = 0x0a00

 開啟檔案的最大總數         (MAXTOTFILOP) = 16000
 CPU 速度 (千分之一秒/命令)       (CPUSPEED) = 4.000000e-005
 通信頻寬 (MB/秒)       (COMM_BANDWIDTH) = 1.250000e+000
                             .
                             .
                             .
                             .
 「TCP/IP服務程式」名稱        (SVCENAME) = db2c_DB2


/* 
  找(SVCENAME)設定值是否正確,不正確則重新設定
  若service name應該為orion_DB2,則使用update dbm cfg 修改
*/


C:\>update dbm cfg using svcename orion_DB2


/* 3) 檢查 etc\services的port number */

開啟C:\WINDOWS\system32\drivers\etc\services
確定以service name使用的port number存在且正確

orion_DB2 50000/tcp


/* 4) 檢查 firewall 設定*/

2008年6月25日 星期三

Unable to update Load History File Entry problem using DB2 UDB8.2

/* db2diag.log裡出現下列錯誤訊息 */


2008-06-26-02.30.26.503000+480 I651705345H542  LEVEL: Error
PID : 2588             TID : 852      PROC : db2syscs.exe
INSTANCE: DB2          NODE : 000     DB : ORIONDB
APPHDL : 0-224          APPID: *LOCAL.DB2.080625183005
FUNCTION: DB2 UDB, database utilities, sqluCommitLoadEntryInHistoryFile, probe:20
MESSAGE : LOADID: 852.2008-06-26-02.30.06.051000.0 (2;804) Unable to update Load History File Entry rc =
DATA #1 : Hexdump, 4 bytes
0x490B48F0 : 8FF7 FFFF ....

2008-06-26-02.30.26.503000+480  I651705889H458  LEVEL: Error
PID : 2588               TID : 852      PROC : db2syscs.exe
INSTANCE: DB2            NODE : 000     DB : ORIONDB
APPHDL : 0-224            APPID: *LOCAL.DB2.080625183005
FUNCTION: DB2 UDB, database utilities, sqluCommitLoadEntryInHistoryFile, probe:21
MESSAGE : LOADID: 852.2008-06-26-02.30.06.051000.0 (2;804) Load History File Entry left in non-committed state.

/*在CLP下 LIST HISTORY 檢示過去LOAD歷程, 並出現下列錯誤訊息 */

C:\>db2 list history load since 20080625 for ORIONDB
sql2161n 無法修正損壞的回復歷程檔,指定動作失敗

/*處理方式 */

0) db2stop
1) 從DB存放的實體路徑下,找DB2RHIST.ASC
  ex:
    C:\DB2\NODE0000\SQL00002\
2) 將DB2RHIST.ASC及DB2RHIST.BAK全部rename
3) db2start

2008年4月1日 星期二

check database object status using DB2 UDB 8.2

/* check view status */

SELECT VIEWSCHEMA,VIEWNAME,VALID,VARCHAR(TEXT)
FROM SYSCAT.VIEWS
WHERE VIEWSCHEMA = 'ADMINISTRATOR'


/* check procedures if function recreate then recreate procedure is needed */

SELECT ROUTINENAME FROM sysibm.sysroutines
WHERE VARCHAR(TEXT) LIKE '%FN_CHKVALIDATE%'


/* 檢查可能失效的PROCEDURE */

SELECT *
FROM SYSIBM.SYSDEPENDENCIES
WHERE DSCHEMA = 'ORION'
AND BNAME NOT IN (SELECT PKGNAME FROM SYSCAT.PACKAGEDEP WHERE BTYPE = 'T')
AND BTYPE = 'K'

/* 檢查那些Stored Procedures用了哪些Functions */

SELECT PROCNAME,FUNCNAME
FROM SYSCAT.PROCEDURES,
(SELECT DNAME SYSDNAME,BNAME SYSNAME FROM SYSIBM.SYSDEPENDENCIES) T,
(SELECT PKGNAME,BNAME PKGBNAME FROM SYSCAT.PACKAGEDEP) T1,
(SELECT FUNCNAME,SPECIFICNAME FUNCSPECIFICNAME FROM SYSCAT.FUNCTIONS) T2
WHERE SPECIFICNAME = T.SYSDNAME
AND T.SYSNAME = T1.PKGNAME
AND T1.PKGBNAME = T2.FUNCSPECIFICNAME;


/* 檢查那些Stored procedure 用了哪些Tables */

SELECT T.DNAME,A.BNAME
FROM SYSCAT.PACKAGEDEP A,
(SELECT BNAME,DNAME from SYSIBM.SYSDEPENDENCIES WHERE DSCHEMA = 'ORION') T
WHERE BTYPE = 'T' AND PKGNAME = T.BNAME


/* 如何檢持哪些VIEW使用哪些TABLES,且是否為VALID */

SELECT A.VIEWNAME,A.BNAME,B.VALID
FROM SYSCAT.VIEWDEP A,SYSCAT.VIEWS B
WHERE A.VIEWNAME = B.VIEWNAME
AND B.DEFINER = 'ORION'

2007年12月27日 星期四

Generate context of procedures、views、functions using DB2 UDB8.2 system tables

/*
generate context of funtions
*/

SELECT FUNCSCHEMA,FUNCNAME,SPECIFICNAME,FUNCID,TYPE,METHOD,VARCHAR(BODY)
FROM SYSCAT.FUNCTIONS
WHERE FUNCSCHEMA = 'DB2ADMIN'
AND TYPE = 'S'

/*
generate context of views
*/

SELECT VIEWSCHEMA,VIEWNAME,VALID,VARCHAR(TEXT)
FROM SYSCAT.VIEWS
WHERE VIEWSCHEMA = 'DB2ADMIN'

/*
generate context of stored procedures
*/

SELECT ROUTINENAME,VARCHAR(TEXT)
FROM SYSIBM.SYSROUTINES
WHERE ROUTINESCHEMA='DB2ADMIN'

/*
using export to generate procedure code when context is very large
check SPBODY.001 and procedures are in it
*/

EXPORT TO C:\SP.SQL OF DEL LOBS TO C:\ LOBFILE SPBODY MODIFIED BY NOCHARDEL LOBSINFILE
"SELECT TEXT FROM SYSIBM.SYSROUTINES WHERE ROUTINESCHEMA='DB2ADMIN'"

Generate table layouts using DB2 UDB8.2 system tables

/*
The quickest and the easiest way to do reverse engineering is using SQL scripts. For example, SQL Script that generating the latest layouts of tables could be looks like this:
*/

SELECT COLSTR || COALESCE(IDENT_STR,'') FROM
(
SELECT (CASE WHEN COLNO = 0 THEN 'CREATE TABLE ' || TBNAME || '( ' ELSE ',' END) || NAME || ' ' ||
(CASE WHEN COLTYPE = 'TIMESTMP' THEN 'TIMESTAMP' ELSE RTRIM(COLTYPE) END) ||
(CASE WHEN COLTYPE IN ('VARCHAR','CHAR') THEN '(' || RTRIM(CHAR(LENGTH)) || ')'
WHEN COLTYPE = 'DECIMAL' THEN '(' || RTRIM(CHAR(LENGTH)) || ',' || RTRIM(CHAR(SCALE)) || ')'
ELSE ''
END) ||
(CASE WHEN NULLS = 'N' THEN ' NOT NULL ' ELSE '' END) ||
(CASE WHEN COLNO = CNO THEN ') IN USERSPACE1;' ELSE '' END) COLSTR,TBNAME,NAME,COLNO
FROM SYSIBM.SYSCOLUMNS,
(SELECT TBNAME TNAME,MAX(COLNO) CNO
FROM SYSIBM.SYSCOLUMNS
GROUP BY TBNAME) TB,
(SELECT NAME TABLENAME
FROM SYSIBM.SYSTABLES
WHERE CREATOR = 'DB2ADMIN'
AND TYPE = 'T') TB2
WHERE TBNAME = TNAME
AND TBNAME = TABLENAME
) TBTMP
LEFT JOIN (SELECT TABNAME,COLNAME,
' GENERATED ALWAYS AS IDENTITY (START WITH ' || RTRIM(CHAR(INT(START))) ||
' INCREMENT BY ' || RTRIM(CHAR(INT(INCREMENT))) || ', NO CACHE)' IDENT_STR
FROM SYSCAT.COLIDENTATTRIBUTES
WHERE TABSCHEMA = 'DB2ADMIN') TB3 ON TBTMP.TBNAME = TB3.TABNAME
AND TBTMP.NAME = TB3.COLNAME
ORDER BY TBNAME,COLNO;

/*
And you could find any primary keys you've altered or created in SYSIBM.SQLPRIMARYKEYS system table. And SQL statement could be this way:
*/

SELECT (CASE WHEN KEY_SEQ = MINSNO THEN 'ALTER TABLE ' || RTRIM(TABLE_NAME) || ' ADD PRIMARY KEY ('
ELSE ',' END) || COLUMN_NAME ||
(CASE WHEN KEY_SEQ = MAXSNO THEN ');' ELSE '' END)
FROM SYSIBM.SQLPRIMARYKEYS,
(
SELECT PK_NAME PK,TABLE_NAME TNAME,MIN(KEY_SEQ) MINSNO,MAX(KEY_SEQ) MAXSNO
FROM SYSIBM.SQLPRIMARYKEYS
WHERE TABLE_SCHEM = 'DB2ADMIN'
GROUP BY PK_NAME,TABLE_NAME
) T
WHERE TABLE_SCHEM = 'DB2ADMIN'
AND TABLE_NAME = TNAME
AND PK_NAME = PK;