2008年11月16日 星期日

Grant privileges to Role and Test Dynamic SQL using DB2 9


/*
  Privilege Grant to Role,再以 Dynamic SQL create objects
  在 Oracle 上測試的結果:
  會產生 Oracle insufficient privileges error, ‘ORA-01031.’
  解決方法是,必須直接 grant 相關的 privileges 給 User
  而在 DB2 上測試並不會發生這樣的問題
*/

/* 接上篇,給定createin權限給TestingUser */

C:\>db2 connect to sample user db2admin using db2admin

  資料庫連線資訊

 資料庫伺服器    = DB2/NT 9.5.0
 SQL 授權 ID    = DB2ADMIN
 本地資料庫別名   = SAMPLE

/* 讓 TestingUser 可以對 Orion 這個 schema 做 alter,create,drop */

C:\>db2 grant alterin,createin,dropin on schema orion to role role_o
DB20000I SQL 指令已順利完成。

C:\>db2 terminate
DB20000I TERMINATE 指令已順利完成。

C:\>db2 connect to sample user testinguser using testinguser

  資料庫連線資訊

 資料庫伺服器    = DB2/NT 9.5.0
 SQL 授權 ID    = TESTINGU...
 本地資料庫別名   = SAMPLE


/*
  用TestingUser create procedure ,內容是 dynamic recreate sequence
  傳入參數 Sequence name
*/


CREATE PROCEDURE SP_CRTSEQ(in SeqName varchar(32))
SPECIFIC SP_CRTSEQ
LANGUAGE SQL
BEGIN
  DECLARE SQLCODE INTEGER DEFAULT 0;
  DECLARE RETCODE INTEGER DEFAULT 0;
  declare szStr varchar(128);
  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,
                   SQLWARNING,
                   NOT FOUND
  SET RETCODE = SQLCODE;

  set szStr = 'DROP SEQUENCE ORION.' || Seqname;
  EXECUTE IMMEDIATE szStr;
  set szstr = 'create SEQUENCE ORION.' || Seqname ||
         ' start with 1 increment by 1';
  EXECUTE IMMEDIATE szstr;
  COMMIT;
END


/* 執行 */

C:\>db2 call sp_crtseq('seq2')

  傳回狀態 = 0

C:\>db2 select orion.seq2.nextval from sysibm.sysdummy1

1
-----------
1

  已選取 1 個記錄。