DROP PROCEDURE — 프로시저 삭제하기
DROP PROCEDURE — 프로시저 삭제하기
DROP PROCEDURE은 이미 존재하는 프로시저(procedure)의 정의를 제거하는 명령이에요. 프로시저의 소유자만 실행할 수 있습니다. 같은 이름에 인자 목록이 다른 프로시저가 여럿 있을 수 있으므로, 보통은 인자 타입을 함께 지정해 줘야 해요.
출처: PostgreSQL 문서
본문
Synopsis
DROP PROCEDURE [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
[ CASCADE | RESTRICT ]
Description
DROP PROCEDURE은 이미 존재하는 프로시저 하나 이상의 정의를 제거해요. 이 명령을 실행하려면 프로시저의 소유자여야 합니다. 같은 이름에 인자 목록이 다른 프로시저가 여러 개 있을 수 있으므로 보통은 프로시저의 인자 타입을 지정해 주어야 해요.
Parameters
- IF EXISTS — 프로시저가 존재하지 않아도 오류를 던지지 않아요. 이 경우에는 통지(notice)만 발행됩니다.
- name — 이미 존재하는 프로시저의 이름(스키마 한정 가능).
- argmode — 인자의 모드:
IN,OUT,INOUT,VARIADIC. 생략하면 기본값은IN이에요 (아래 설명 참고). - argname — 인자의 이름. 프로시저의 정체를 결정할 때는 인자 데이터 타입만 사용되므로,
DROP PROCEDURE는 인자 이름을 실제로 신경 쓰지 않아요. - argtype — 프로시저 인자의 데이터 타입(들)(스키마 한정 가능). 자세한 내용은 아래 설명을 참고하세요.
- CASCADE — 프로시저에 의존하는 객체와, 나아가 그 객체들에 의존하는 모든 객체를 자동으로 함께 삭제해요 (5.15절 참고).
- RESTRICT — 프로시저에 의존하는 객체가 있으면 삭제를 거부해요. 이게 기본값이에요.
Notes
주어진 이름의 프로시저가 하나뿐이라면 인자 목록을 생략할 수 있어요. 이 경우 괄호도 함께 생략하세요.
PostgreSQL에서는 같은 이름의 루틴 두 개가 같은 입력 인자 목록을 공유할 수 없기 때문에, 입력( INOUT 포함) 인자만 나열하면 충분해요. 게다가 DROP 명령은 OUT 인자의 타입을 올바르게 적었는지 실제로 확인하지 않아요. 그래서 명시적으로 OUT으로 표시된 인자는 그냥 잡음(noise)일 뿐이에요. 그래도 대응하는 CREATE 명령과의 일관성을 위해 적어 두는 것을 권장합니다.
SQL 표준과의 호환을 위해, argmode 표시 없이 모든 인자 데이터 타입(OUT 인자 포함)을 적는 것도 허용됩니다. 이렇게 하면 프로시저의 OUT 인자 타입이 실제로 명령과 대조·검증됩니다. 다만 이 규정은 모호함을 만들기도 해요. 인자 목록에 argmode 표시가 하나도 없으면 어떤 규칙을 의도한 건지 불분명해지거든요. DROP 명령은 두 방식으로 모두 조회를 시도하고, 서로 다른 프로시저 두 개가 발견되면 오류를 던집니다. 이런 모호함의 위험을 피하려면 IN 표시를 기본값에 맡기지 말고 명시적으로 적어, 전통적인 PostgreSQL 해석이 사용되도록 하는 것이 좋아요.
방금 설명한 조회 규칙은 ALTER PROCEDURE나 COMMENT ON PROCEDURE처럼 기존 프로시저를 다루는 다른 명령에서도 동일하게 사용됩니다.
Examples
프로시저가 do_db_maintenance 하나뿐이라면 아래 명령만으로 삭제할 수 있어요.
DROP PROCEDURE do_db_maintenance;
이런 프로시저 정의가 있을 때:
CREATE PROCEDURE do_db_maintenance(IN target_schema text, OUT results text) ...
아래 명령 중 아무거나 써도 해당 프로시저를 삭제할 수 있어요.
DROP PROCEDURE do_db_maintenance(IN target_schema text, OUT results text);
DROP PROCEDURE do_db_maintenance(IN text, OUT text);
DROP PROCEDURE do_db_maintenance(IN text);
DROP PROCEDURE do_db_maintenance(text);
DROP PROCEDURE do_db_maintenance(text, text); -- 잠재적으로 모호
하지만 마지막 예시는 이런 프로시저도 함께 존재하면 모호해질 수 있어요.
CREATE PROCEDURE do_db_maintenance(IN target_schema text, IN options text) ...
Compatibility
이 명령은 SQL 표준을 따르며, 아래 항목은 PostgreSQL의 확장입니다.
- 표준은 명령 하나로 프로시저를 하나만 삭제할 수 있어요.
IF EXISTS옵션은 확장이에요.- 인자 모드와 이름을 지정할 수 있는 기능은 확장이고, 모드가 주어지면 조회 규칙도 달라져요.