DROP TABLE

DROP TABLE

현재 또는 지정된 스키마에서 테이블을 제거하는 명령이에요. 하지만 삭제된 테이블의 버전을 보존하여 UNDROP TABLE로 복구할 수 있어요.

출처: 문서

본문

구문 (Syntax)

DROP TABLE [ IF EXISTS ] <name> [ CASCADE | RESTRICT ]

파라미터

  • name — 삭제할 테이블의 식별자를 지정해요. 식별자에 공백, 특수 문자, 또는 대소문자 혼합 문자가 포함되면 전체 문자열을 큰따옴표로 묶어야 해요. 큰따옴표로 묶은 식별자는 대소문자를 구분해요(예: "My Object"). 테이블 식별자가 정규화되지 않았다면(즉 db_name.schema_name.table_name 또는 schema_name.table_name 형식이 아니라면), 명령은 세션의 현재 스키마에서 테이블을 찾아요.
  • CASCADE | RESTRICT — 테이블을 참조하는 외래 키가 존재할 때 테이블을 삭제할 수 있는지 여부를 지정해요:
    • CASCADE — 다른 테이블의 외래 키가 참조하는 기본/고유 키가 있어도 테이블을 삭제해요.
    • RESTRICT — 기존 외래 키 참조에 대한 경고를 반환하고 테이블을 삭제하지 않아요.
    • 기본값: 표준 테이블은 CASCADE, 하이브리드 테이블은 RESTRICT.

접근 제어 요구사항 (Access control requirements)

이 작업을 실행하는 역할은 최소한 다음 권한을 가져야 해요:

Privilege Object Notes
OWNERSHIP Table OWNERSHIP은 객체 생성 역할에 자동 부여되는 특수 권한이지만, 소유 역할(또는 MANAGE GRANTS 권한이 있는 역할)이 GRANT OWNERSHIP 명령으로 다른 역할에 이전할 수도 있어요.

사용 메모 (Usage notes)

  • 테이블을 삭제해도 시스템에서 영구적으로 제거되지는 않아요. 삭제된 테이블의 버전은 테이블의 데이터 보존 기간이 지정한 일수만큼 Time Travel에 유지돼요. Time Travel 보존 기간 내에서는 UNDROP TABLE 명령으로 삭제된 테이블을 복원할 수 있어요.
  • 테이블을 삭제한 후 계정이나 부모 객체(데이터베이스 또는 스키마)의 Time Travel 보존 기간을 변경해도 삭제된 테이블의 Time Travel 보존 기간은 변경되지 않아요.
  • Time Travel 보존 기간이 끝나면, 삭제된 테이블의 다음 상태는 영구(permanent), 임시(transient), 또는 임시(temporary)인지에 따라 달라져요.
    • 영구 테이블은 Fail-safe로 이동해요. Fail-safe(7일)에서 삭제된 테이블은 Snowflake만 복구할 수 있어요. 테이블이 Fail-safe를 벗어나면 제거(purge)돼요.
    • 임시 또는 임시 테이블은 Fail-safe가 없으므로 Time Travel을 벗어나면 제거돼요.

    참고: 장기 실행 Time Travel 쿼리는 계정의 데이터와 객체(테이블, 스키마, 데이터베이스)가 쿼리가 완료될 때까지 Fail-safe로 이동하는 것을 지연시켜요. 임시 및 임시 테이블의 제거도 같은 방식으로 지연돼요.

  • 삭제된 테이블이 제거된 후에는 복구할 수 없으므로 다시 만들어야 해요.
  • 테이블을 삭제한 후 같은 이름으로 테이블을 만들면 새 버전의 테이블이 생성돼요. 다음 단계를 따라 이전 테이블의 삭제된 버전을 복원할 수 있어요:
    • 현재 버전의 테이블 이름을 변경해요.
    • UNDROP TABLE 명령으로 이전 버전의 테이블을 복원해요.
  • 테이블을 삭제하기 전에 어떤 뷰도 테이블을 참조하지 않는지 확인해요. 뷰가 참조하는 테이블을 삭제하면 뷰가 무효화돼요(즉 뷰를 쿼리하면 "object does not exist" 오류가 반환돼요).
  • 테이블을 삭제하려면 테이블에 대한 OWNERSHIP 권한이 있는 역할을 사용해야 해요.
  • IF EXISTS 절을 지정했을 때 대상 객체가 존재하지 않으면, 명령은 오류를 반환하지 않고 성공적으로 완료돼요.

하이브리드 테이블 삭제 (Dropping hybrid tables)

RESTRICT 또는 CASCADE 옵션을 지정하지 않고 하이브리드 테이블을 삭제할 때, 하이브리드 테이블이 다른 테이블과 기본 키/외래 키 또는 고유 키/외래 키 관계를 가지면 DROP TABLE 명령은 오류로 실패해요. 기본 동작은 RESTRICT예요.

예를 들어:

CREATE OR REPLACE HYBRID TABLE ht1(
  col1 NUMBER(38,0) NOT NULL,
  col2 NUMBER(38,0) NOT NULL,
  CONSTRAINT pkey_ht1 PRIMARY KEY (col1, col2));

CREATE OR REPLACE HYBRID TABLE ht2(
  cola NUMBER(38,0) NOT NULL,
  colb NUMBER(38,0) NOT NULL,
  colc NUMBER(38,0) NOT NULL,
  CONSTRAINT pkey_ht2 PRIMARY KEY (cola),
  CONSTRAINT fkey_ht1 FOREIGN KEY (colb, colc) REFERENCES ht1(col1,col2));

DROP TABLE ht1;
SQL compilation error:
Cannot drop the table because of dependencies

이 경우 DROP TABLE 명령은 실패해요. 필요한 경우 DROP TABLE 명령에 CASCADE를 지정하여 기본 동작을 재정의할 수 있어요.

DROP TABLE ht1 CASCADE;

또는 이 경우 먼저 종속 테이블 ht2를 삭제한 다음 테이블 ht1을 삭제할 수도 있어요.

예시 (Examples)

테이블을 삭제해요:

SHOW TABLES LIKE 't2%';

+---------------------------------+------+---------------+-------------+-----------+------------+------------+------+-------+--------------+----------------+
| created_on                      | name | database_name | schema_name | kind      | comment    | cluster_by | rows | bytes | owner        | retention_time |
|---------------------------------+------+---------------+-------------+-----------+------------+------------+------+-------+--------------+----------------+
| Tue, 17 Mar 2015 16:48:16 -0700 | T2   | TESTDB        | PUBLIC      | TABLE     |            |            |    5 | 4096  | PUBLIC       |              1 |
+---------------------------------+------+---------------+-------------+-----------+------------+------------+------+-------+--------------+----------------+

DROP TABLE t2;

+--------------------------+
| status                   |
|--------------------------|
| T2 successfully dropped. |
+--------------------------+

SHOW TABLES LIKE 't2%';

+------------+------+---------------+-------------+------+---------+------------+------+-------+-------+----------------+
| created_on | name | database_name | schema_name | kind | comment | cluster_by | rows | bytes | owner | retention_time |
|------------+------+---------------+-------------+------+---------+------------+------+-------+-------+----------------|
+------------+------+---------------+-------------+------+---------+------------+------+-------+-------+----------------+

테이블을 다시 삭제하되, 테이블이 존재하지 않아도 오류를 발생시키지 않아요:

DROP TABLE IF EXISTS t2;

+------------------------------------------------------------+
| status                                                     |
|------------------------------------------------------------|
| Drop statement executed successfully (T2 already dropped). |
+------------------------------------------------------------+

더 알아보기 (Learn more)