Pourquoi ne puis-je pas SUPPRIMER un objet dans mon cluster Amazon Redshift ?

Date de la dernière mise à jour : 10/09/2020

Je ne peux pas supprimer une table ou une vue dans mon cluster Amazon Redshift. Pourquoi ?

Brève description

Il se peut que vous ne puissiez pas supprimer un objet (tel qu'une table ou une vue) dans votre cluster Amazon Redshift pour les raisons suivantes :

  • Autorisations insuffisantes : l'utilisateur ne dispose pas des autorisations appropriées pour supprimer l'objet. (L'utilisateur doit être propriétaire de l'objet ou disposer de droits d'administrateur.)
  • Dépendance d'objet : les colonnes de la table sont référencées par une autre vue ou une autre table.
  • Conflit de verrouillage : une transaction maintenir un verrou sur l'objet, ce qui entraîne le blocage de l'opération de dépôt.

Résolution

Autorisations insuffisantes

Dans Amazon Redshift, seul le propriétaire de la table, le propriétaire du schéma ou un superutilisateur peut supprimer une table.

Pour confirmer les autorisations et la propriété des utilisateurs, créez une vue à l'aide du script v_get_obj_priv_by_user.sql :

CREATE OR REPLACE VIEW admin.v_get_obj_priv_by_user
AS
SELECT

Dépendance d'objet

Votre opération de suppression peut échouer avec le message d'erreur suivant :

Invalid operation: cannot drop table/view <object_name> because other objects depend on it

L'erreur Opération non valide indique les dépendances d'objet sur l'objet cible.

Pour identifier les objets qui dépendent de la table cible, créez les trois vues suivantes :

Après avoir créé ces trois vues, utilisez le script v_object_dependency.sql pour obtenir les objets dépendants de l'objet cible :

select * from admin.v_object_dependency where src_objectname=<target object>

Après avoir vérifié tous les objets dépendants, supprimez tous les objets associés avec l'objet cible à l'aide du paramètre CASCADE :

drop table <target object> cascade;

Conflit de verrouillage

Si la commande de suppression se bloque ou ne produit rien lorsque vous effectuez une suppression, une transaction peut maintenir un verrou sur l'objet. Par conséquent, vous ne pouvez pas acquérir l'AccessExclusiveLock sur la table. L'AccessExclusiveLock est nécessaire pour supprimer un objet.

Pour identifier les verrous, utilisez la syntaxe suivante :

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);

Après avoir identifié les verrous, utilisez PG_TERMINATE_BACKEND pour libérer les verrous. Pour plus d'informations sur la détection et la libération de verrous, consultez la section Comment puis-je détecter les verrous dans Amazon Redshift, et les désactiver ?


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?