pg_depend
pg_dependカタログは、データベースオブジェクト間の依存関係を記録します。
この情報によってDROPコマンドが、他のどのオブジェクトをDROP CASCADEで削除する必要があるか、また、DROP RESTRICTで削除を防止するかの場合を判断します。
pg_shdependも参照してください。
これはデータベースクラスタ間で共有されるオブジェクトの依存関係に対する似たような機能を持っています。
表52.18 pg_dependの列
| 名前 | 型 | 参照先 | 説明 |
|---|---|---|---|
classid | oid | | 依存するオブジェクトを含んだシステムカタログのOID |
objid | oid | any OID column | 特定の依存するオブジェクトのOID |
objsubid | int4 |
テーブル列の場合、これは列番号です(objidとclassidはテーブル自身を参照します)。
他のすべての種類のオブジェクトでは、このフィールドはゼロです。
| |
refclassid | oid | | 参照されるオブジェクトが存在するシステムカタログのOID |
refobjid | oid | any OID column | 特定の参照されるオブジェクトのOID |
refobjsubid | int4 |
テーブル列の場合、これは列番号です(refobjidとrefclassidはテーブル自身を参照します)。
他のすべての種類のオブジェクトでは、このフィールドはゼロです。
| |
deptype | char | この依存関係の特定のセマンティクスを定義するコード(後述)。 |
すべての場合において、pg_dependエントリは依存するオブジェクトも削除しない限り、参照されるオブジェクトを削除できないことを示します。
もっとも、deptypeによって指定される以下のようないくつかのオプションもあります。
DEPENDENCY_NORMAL (n)
個別に作成されたオブジェクト間の通常の関係です。
依存するオブジェクトは参照されるオブジェクトに影響を与えずに削除できます。
参照されるオブジェクトはCASCADEを指定することによってのみ削除することができます。
この場合は依存するオブジェクトも削除されます。
例:テーブルの列はそのデータ型に対して通常の依存関係を持ちます。
DEPENDENCY_AUTO (a)
依存するオブジェクトは参照されるオブジェクトから独立して削除することができます。
そして、参照されるオブジェクトが削除される時は(RESTRICTもしくはCASCADEモードに関わりなく)依存するオブジェクトも自動的に削除されなければなりません。
例:テーブル上の名前付き制約はテーブル上に自動設定されているため、テーブルが削除されるとなくなります。
DEPENDENCY_INTERNAL (i)
依存するオブジェクトは参照されるオブジェクトの作成時に作成されたもので、実際に内部実装の一部に過ぎません。
依存するオブジェクトに対してDROPコマンドを直接的に実行できません
(その代わりに、参照されるオブジェクトに対してDROPを実行するように指示されます)。
参照されるオブジェクトにDROPを実行すると、CASCADEが指定されているかどうかに関わらず、依存するオブジェクトも削除されます。
例:外部キー制約を強制するために作成されたトリガは内部的に制約のpg_constraint項目に依存しています。
DEPENDENCY_INTERNAL_AUTO (I)
依存するオブジェクトは参照されるオブジェクトの生成の一環で作成され、実際にはこれは内部的な実装の一部に過ぎません。
依存するオブジェクトのDROPは全面的に禁止されます。
(その代わり参照されるオブジェクトに対してDROPを発行するようにユーザに通告します。)
通常の内部的な依存関係のもとでは、依存するオブジェクトは依存性が残っている限りは削除されませんが、DEPENDENCY_INTERNAL_AUTOは依存性を追跡する中でそうしたオブジェクトが見つかった場合には削除を許容します。
例をあげます。
パーティション上のインデックスは、パーティション自身とその親パーティションテーブルの両方で内部的自動依存(internal-auto-dependent)となります。
したがって、そのパーティションインデックスは、インデックスが付与されているパーティション自身または付与されている親インデックスのどちらかが削除される際に同時に削除されます。
DEPENDENCY_EXTENSION (e)
依存するオブジェクトは参照されるオブジェクトの拡張のメンバです(pg_extension参照)。
依存するオブジェクトは参照されるオブジェクトに対するDROP EXTENSION経由でのみ削除することができます。
機能的にはこの種類の依存関係は内部依存関係と同様に動作しますが、明確さとpg_dumpを単純化するために別々に保持されます。
DEPENDENCY_AUTO_EXTENSION (x)依存するオブジェクトは参照されるオブジェクトの拡張のメンバではありません(そしてそれゆえpg_dumpによって無視されません)が、参照されるオブジェクトなしに機能することが出来ず、拡張自体が削除される時に削除されるでしょう。 依存するオブジェクトは、同様にそれ自身で削除されるかもしれません。
DEPENDENCY_PIN (p)
依存するオブジェクトはありません。
この種類の項目は、参照されるオブジェクトにシステム自体が依存し、したがってオブジェクトを絶対に削除してはならないことを示します。
この種類の項目はinitdbの実行時にのみ作成されます。
依存するオブジェクト列にはゼロが含まれます。
将来的に、他の依存関係のオプションが必要になる可能性があります。