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). |
+------------------------------------------------------------+