CREATE LANGUAGE

CREATE LANGUAGE

새 절차적 언어(procedural language)를 PostgreSQL 데이터베이스에 등록하는 명령이에요. 이 언어로 함수와 프로시저를 정의할 수 있게 됩니다.

출처: PostgreSQL 문서

본문

문법 (Synopsis)

CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name
    HANDLER call_handler [ INLINE inline_handler ] [ VALIDATOR valfunction ]
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name

설명 (Description)

CREATE LANGUAGE는 새 절차적 언어를 PostgreSQL 데이터베이스에 등록해요. 이후 이 새 언어로 함수와 프로시저를 정의할 수 있습니다.

CREATE LANGUAGE는 사실상 언어 이름을 그 언어로 작성된 함수를 실행하는 핸들러 함수(들)와 연결합니다. 언어 핸들러에 대한 자세한 내용은 57장을 참고하세요.

CREATE OR REPLACE LANGUAGE는 새 언어를 만들거나 기존 정의를 교체해요. 언어가 이미 있으면 그 파라미터는 명령에 따라 갱신되지만, 언어의 소유권과 권한 설정은 바뀌지 않으며 그 언어로 작성된 기존 함수들도 여전히 유효하다고 가정합니다.

새 언어를 등록하거나 기존 언어의 파라미터를 바꾸려면 PostgreSQL 슈퍼유저 권한이 있어야 해요. 다만 언어가 만들어지면 소유권을 비슈퍼유저에게 넘겨줄 수 있고, 그 사용자는 언어를 삭제하거나 권한을 바꾸거나 이름을 바꾸거나 새 소유자에게 넘길 수 있습니다. (단, 그 밑바탕이 되는 C 함수의 소유권을 비슈퍼유저에게 넘기면 안 돼요. 그건 권한 상승 경로를 만들어 주기 때문입니다.)

핸들러 함수를 제공하지 않는 CREATE LANGUAGE 형태는 폐기된 것이에요. 오래된 덤프 파일과의 역호환성을 위해 CREATE EXTENSION으로 해석됩니다. 언어가 같은 이름의 확장으로 패키징되어 있다면 동작하는데, 그게 절차적 언어를 설치하는 일반적인 방식이에요.

파라미터 (Parameters)

  • TRUSTED — 이 언어가 사용자가 원래 갖고 있지 않은 데이터에 대한 접근을 부여하지 않는다는 것을 지정해요. 등록 시 이 키워드를 생략하면 PostgreSQL 슈퍼유저 권한이 있는 사용자만 이 언어로 새 함수를 만들 수 있습니다.
  • PROCEDURAL — 그냥 채우는(noise) 단어예요.
  • name — 새 절차적 언어의 이름. 데이터베이스의 언어들 사이에서 유일해야 합니다.
  • HANDLER call_handler — 절차적 언어의 함수를 실행하기 위해 호출되는, 이전에 등록된 함수의 이름. 절차적 언어의 호출 핸들러는 C 같은 컴파일 언어로 version 1 호출 규약으로 작성돼야 하고, 인자가 없고 language_handler 타입을 반환하는 함수로 PostgreSQL에 등록돼야 해요. language_handler는 그 함수가 호출 핸들러임을 식별하는 데 쓰는 자리표시 타입입니다.
  • INLINE inline_handler — 이 언어로 된 익명 코드 블록(DO 명령)을 실행하기 위해 호출되는, 이전에 등록된 함수의 이름. inline_handler를 지정하지 않으면 그 언어는 익명 코드 블록을 지원하지 않아요. 핸들러 함수는 internal 타입 인자 하나(그게 DO 명령의 내부 표현)를 받아야 하며 보통 void를 반환합니다. 핸들러 반환값은 무시됩니다.
  • VALIDATOR valfunction — 그 언어의 새 함수가 만들어질 때 그 함수를 검증하기 위해 호출되는, 이전에 등록된 함수의 이름. 검증 함수를 지정하지 않으면 새 함수는 만들어질 때 검사되지 않아요. 검증 함수는 oid 타입 인자 하나(만들어질 함수의 OID)를 받아야 하며 보통 void를 반환합니다. 검증 함수는 보통 함수 본문의 문법적 정확성을 검사하지만, 언어가 특정 인자 타입을 다룰 수 없는 경우처럼 함수의 다른 속성도 볼 수 있어요. 오류를 알리려면 검증 함수는 ereport() 함수를 사용해야 합니다. 이 함수의 반환값은 무시됩니다.

주의 사항 (Notes)

절차적 언어를 제거하려면 DROP LANGUAGE를 사용하세요.

시스템 카탈로그 pg_language(52.29절 참고)가 현재 설치된 언어 정보를 기록합니다. 또한 psql 명령 \dL이 설치된 언어를 나열해 줘요.

절차적 언어로 함수를 만들려면 사용자에게 그 언어에 대한 USAGE 권한이 있어야 합니다. 기본적으로 신뢰할 수 있는(trusted) 언어에 대해서는 USAGEPUBLIC(즉 모든 사람)에게 부여돼요. 원하면 취소할 수 있습니다.

절차적 언어는 개별 데이터베이스에 한정됩니다. 다만 언어를 template1 데이터베이스에 설치하면 이후 새로 만들어지는 모든 데이터베이스에서 자동으로 사용할 수 있게 됩니다.

예제 (Examples)

새 절차적 언어를 만드는 최소한의 절차는 다음과 같아요:

CREATE FUNCTION plsample_call_handler() RETURNS language_handler
    AS '$libdir/plsample'
    LANGUAGE C;
CREATE LANGUAGE plsample
    HANDLER plsample_call_handler;

보통은 그게 확장 생성 스크립트에 쓰이고, 사용자는 이렇게 해서 확장을 설치합니다:

CREATE EXTENSION plsample;

호환성 (Compatibility)

CREATE LANGUAGE는 PostgreSQL 확장 기능이에요.

함께 보기 (See Also)

ALTER LANGUAGE, CREATE FUNCTION, DROP LANGUAGE, GRANT, REVOKE

더 알아보기 (Learn more)

  • CREATE EXTENSION: 확장에 패키징된 절차적 언어를 설치하는 명령.
  • ALTER LANGUAGE: 언어 정의를 변경하는 명령.