PostgreSQL | スキーマ | スキーマの削除(DROP SCHEMA)

DROP SCHEMA コマンドを使用して、作成済みのスキーマを削除する方法について説明する。

スキーマを削除する

DROP SCHEMA コマンドを使用してスキーマを削除する。形式は次のとおりである。

DROP SCHEMA [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

指定したスキーマ (name) を削除する。スキーマにテーブルなどのオブジェクトが含まれている場合、CASCADE を指定するとオブジェクトを含めて削除する。RESTRICT を指定すると削除を取り消す。デフォルトは RESTRICT である。

スキーマを削除するには、コマンドを実行するロールがスーパーユーザーまたはスキーマ所有者である必要がある。また、CASCADE を指定すると、一度に削除されるオブジェクトの所有者が別であっても、そのオブジェクトは削除される。

それでは実際に試してみる。一般ユーザー kimkc ロールで PostgreSQL の devkuma データベースに接続する。psql メタコマンド \dn を実行して確認すると、現在のデータベースには kimkc ロール所有の fruit スキーマが作成されている。

devkuma=# \dn
 스키마(schema) 목록
   이름   |  소유주
----------+----------
 fruit    | kimkc
 myschema | postgres
 public   | postgres
(3개 행)


devkuma=#

fruit スキーマを削除する。次のように実行する。

devkuma=# drop schema fruit;
DROP SCHEMA
devkuma=#

スキーマが削除された。確認のため、もう一度 \dn コマンドを実行してみる。

devkuma=# \dn
 스키마(schema) 목록
   이름   |  소유주
----------+----------
 myschema | postgres
 public   | postgres
(2개 행)


devkuma=#

fruit スキーマが削除されたことを確認できる。

次に、再び kimkc ロールを使用して apple スキーマを作成する。

C:\Users\kimkc>psql -U kimkc -d devkuma
kimkc 사용자의 암호:
psql (12.2)
도움말을 보려면 "help"를 입력하십시오.

devkuma=# create schema apple;
CREATE SCHEMA
devkuma=#

kimkc ロールとは別のスーパーユーザーのロールを使用して、apple スキーマにテーブルを作成する。

C:\Users\kimkc>psql -U postgres -d devkuma
postgres 사용자의 암호:
psql (12.2)
도움말을 보려면 "help"를 입력하십시오.

devkuma=# create table apple.blog (id integer);
CREATE TABLE
devkuma=#

これで apple スキーマには、kimkc ロールとは異なるロールが所有者であるテーブルが作成された。

devkuma=# \dt apple.*;
      릴레이션(relation) 목록
 스키마 | 이름 |  종류  |  소유주
--------+------+--------+----------
 apple  | blog | 테이블 | postgres
(1개 행)


devkuma=#

それでは kimkc ロールを使用して apple スキーマを削除するため、次のように実行する。

C:\Users\kimkc>psql -U kimkc -d devkuma
kimkc 사용자의 암호:
psql (12.2)
도움말을 보려면 "help"를 입력하십시오.

devkuma=# drop schema apple;
오류:  기타 다른 개체들이 이 개체에 의존하고 있어, apple 스키마 삭제할 수 없음
상세정보:  apple.blog 테이블 의존대상: apple 스키마
힌트:  이 개체와 관계된 모든 개체들을 함께 삭제하려면 DROP ... CASCADE 명령을 사용하십시오
devkuma=#

すると「오류: 기타 다른 개체들이 이 개체에 의존하고 있어, apple 스키마 삭제할 수 없음」というエラーメッセージが表示され、スキーマを削除できない。

明示的に CASCADE を指定しない場合は RESTRICT を指定したのと同じなので、スキーマ内にオブジェクトが存在すると削除できない。

今回は CASCADE を指定して apple スキーマを削除する。次のように実行する。

devkuma=# drop schema apple cascade;
알림:  apple.blog 테이블 개체가 덩달아 삭제됨
DROP SCHEMA
devkuma=#

apple スキーマが削除された。apple スキーマには別の所有者が作成したテーブルが含まれていたが、同時に削除された。

ここまで、DROP SCHEMA コマンドを使用して作成済みのスキーマを削除する方法について説明した。