2.10. 依存関係の追跡

外部キー制約や、ビュー、トリガ、関数などを使ったテーブルが多数含まれるような複雑なデータベース構造を作成すると、ユーザはそれらのオブジェクト間の依存関係の「網」も作成していることになります。 たとえば、外部キー制約を持つテーブルは、参照するテーブルに依存しています。

データベース構造全体の整合性を保つため、PostgreSQL は、他のオブジェクトと依存関係にあるオブジェクトのドロップを許可しません。 たとえば、Section 2.4.5 で作成した products テーブルをドロップしようとしても、orders テーブルがこのテーブルに依存しているので、以下のようなエラーメッセージが現れます。

DROP TABLE products;
NOTICE:  constraint $1 on table orders depends on table products
ERROR:  Cannot drop table products because other objects depend on it
        Use DROP ... CASCADE to drop the dependent objects too

エラーメッセージには役に立つヒントが含まれています。 以下のようにすると、依存するすべてのオブジェクトを 1 つずつ削除する手間を省けます。

DROP TABLE products CASCADE;

これですべての依存オブジェクトが削除されます。 この場合、orders テーブルは削除されずに外部キー制約のみが削除されます。 (DROP ... CASCADE の機能を知りたい場合は、CASCADE を指定せずに DROP を実行して NOTICE メッセージを読んでください。)

PostgreSQL では、すべての drop コマンドに CASCADE を指定することができます。 もちろん、どのような依存関係が存在するかは、オブジェクトの型によって異なります。 また、CASCADE ではなく RESTRICT と記述すると、他のオブジェクトが依存しているオブジェクトのドロップを禁止するというデフォルトの振る舞いを指定することもできます。

Note: SQL 標準では、RESTRICT または CASCADE のいずれかを指定する必要があります。 実際にこのとおりに実装しているデータベースシステムはありませんが、デフォルトが RESTRICT であるか、CASCADE であるかは、システムによって異なります。

Note: PostgreSQL の 7.3 より前のバージョンにおける外部キー制約の依存関係とシリアル列の依存関係は、アップグレード処理において維持も作成もされません。 その他すべての依存関係の型は、アップグレード中に適切に作成されます。