Amazon Redshift クラスターでオブジェクトを削除できないのはなぜですか?
最終更新日: 2020 年 9 月 10 日
Amazon Redshift クラスターでテーブルやビューを削除できません。なぜこうなったのでしょうか?
簡単な説明
以下の理由により、Amazon Redshift クラスター内のオブジェクト (テーブルやビューなど) を削除できない場合があります。
- アクセス許可が不十分: ユーザーにはオブジェクトを削除するための適切な権限がない。(ユーザーは、オブジェクトの所有者であるか、管理者権限を持っている必要があります)。
- オブジェクトの依存関係: テーブルの列が別のビューまたはテーブルによって参照されている
- ロックの競合: トランザクションがオブジェクトをロックしているため、ドロップ操作がハングする。
解決方法
アクセス許可が不十分
Amazon Redshift では、テーブルの所有者、スキーマ所有者、またはスーパーユーザーのみがテーブルを削除できます。
ユーザーのアクセス許可と所有権を確認するには、v_get_obj_priv_by_user.sql スクリプトを使用してビューを作成します。
CREATE OR REPLACE VIEW admin.v_get_obj_priv_by_user
AS
SELECT
オブジェクトの依存関係
ドロップ操作が失敗すると、次のエラーメッセージが表示されることがあります。
Invalid operation: cannot drop table/view <object_name> because other objects depend on it
無効な操作エラーは、ターゲットオブジェクトに対するオブジェクトの依存関係を示します。
ターゲットテーブルに依存するオブジェクトを識別するには、次の 3 つのビューを作成します。
- 制約の依存関係を識別するビュー
- 従属ビューを識別するビュー
- 上記の 2 つのビューを集約するオブジェクトビュー
これらの 3 つのビューを作成したら、v_object_dependency.sql スクリプトを使用して、ターゲットオブジェクトの依存オブジェクトを取得します。
select * from admin.v_object_dependency where src_objectname=<target object>
すべての依存オブジェクトを確認した後、CASCADE パラメータを使用して、ターゲットオブジェクトとともにすべての関連オブジェクトをドロップします。
drop table <target object> cascade;
ロックの競合
削除の実行時に drop コマンドがハングするか、何も出力されない場合、トランザクションがオブジェクトのロックを保持している可能性があります。その結果、テーブル上の AccessExclusiveLock を取得することはできません。オブジェクトを削除するには、AccessExclusiveLock が必要です。
ロックを識別するには、次の構文を使用します。
select a.txn_owner, a.txn_db, a.xid, a.pid, a.txn_start, a.lock_mode, a.relation as table_id,nvl(trim(c."name"),d.relname) as tablename, a.granted,b.pid as blocking_pid ,datediff(s,a.txn_start,getdate())/86400||' days '||datediff(s,a.txn_start,getdate())%86400/3600||' hrs '||datediff(s,a.txn_start,getdate())%3600/60||' mins '||datediff(s,a.txn_start,getdate())%60||' secs' as txn_duration
from svv_transactions a
left join (select pid,relation,granted from pg_locks group by 1,2,3) b
on a.relation=b.relation and a.granted='f' and b.granted='t'
left join (select * from stv_tbl_perm where slice=0) c
on a.relation=c.id
left join pg_class d on a.relation=d.oid
where a.relation is not null;
And once you identify the locking transaction either COMMIT the blocking transaction or terminate the session of the blocking transaction if it is no longer necessary by :
select pg_terminate_backend(PID);
ロックを特定したら、PG_TERMINATE_BACKEND を使用してロックを解放します。Amazon Redshift でロックを検出して解除する詳細については、「Amazon Redshift でロックを検出し、解除する方法を教えてください」を参照してください。