ユーザー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または他の核オプションの横に)権限を付与することは可能ですか?
それでは答えを追加します。 mustaccio によるコメントは、UがTを所有しているため、UがTをドロップできることを理解させました。しかし、Tがドロップされると、CREATIN
は、スキーマのU。
解決策は、スキーマS、GRANT CREATIN/DROPIN ON SをユーザーUに作成し、TのスキーマをSに変更することです。