web-dev-qa-db-ja.com

交付手続き

ユーザーUが実行するバッチプロセスは、作業テーブルTをドロップして作成します。簡略化されたセットアップ:

ユーザーUの権限

db2 grant dataaccess on database to user U
db2 grant all on table T to user U
db2 transfer ownership of table T to user U 

コードはいくつかの場所から呼び出されるので、プロシージャPからテーブルを削除して作成すると、テーブルごとに異なるコードが作成されるのを防ぐのに便利だと思いました。

db2 -td@ -f "create procedure P()
   LANGUAGE SQL
   BEGIN
       BEGIN
           -- do nothing if drop table fails
           DECLARE CONTINUE HANDLER FOR SQLSTATE '42704'
           BEGIN
           END;
           execute immediate 'drop table T';
       END;
       execute immediate 'CREATE TABLE T (x int)';
END @"

ただし、ユーザーUがこのプロシージャを呼び出すと、次のエラーで失敗します。

db2 "call P()"
SQL0551N  The statement failed because the authorization ID does not have the 
required authorization or privilege to perform the operation.  Authorization 
ID: "U". Operation: "CREATE TABLE". Object: T SQLSTATE=42501

プロシージャPを正常に実行できるように、ユーザーUに(dbadmまたは他の核オプションの横に)権限を付与することは可能ですか?

1
Lennart

それでは答えを追加します。 mustaccio によるコメントは、UがTを所有しているため、UがTをドロップできることを理解させました。しかし、Tがドロップされると、CREATINは、スキーマのU。

解決策は、スキーマS、GRANT CREATIN/DROPIN ON SをユーザーUに作成し、TのスキーマをSに変更することです。

0
Lennart