ALTER PROCEDURE
ALTER PROCEDURE
기존 저장 프로시저(stored procedure)의 속성을 수정하는 명령이에요. 여기서 지원하지 않는 변경이 필요하면 DROP PROCEDURE를 사용해 삭제한 뒤 저장 프로시저를 다시 만들어야 해요.
출처: 문서
본문
관련 명령: CREATE PROCEDURE, DROP PROCEDURE, SHOW PROCEDURES, DESCRIBE PROCEDURE, SHOW USER PROCEDURES
구문 (Syntax)
ALTER PROCEDURE의 구문은 UDF 핸들러로 사용하는 언어에 따라 달라져요.
Java 핸들러
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) RENAME TO <new_name>
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) SET
[ LOG_LEVEL = '<log_level>' ]
[ TRACE_LEVEL = '<trace_level>' ]
[ EXTERNAL_ACCESS_INTEGRATIONS = '<integration_name>' [ , '<integration_name>' ... ] ]
[ SECRETS = '<secret_variable_name>' = <secret_name> [ , '<secret_variable_name>' = <secret_name> ... ] ]
[ COMMENT = '<string_literal>' ]
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) UNSET COMMENT
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) SET TAG <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ]
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) UNSET TAG <tag_name> [ , <tag_name> ... ]
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) EXECUTE AS { OWNER | CALLER | RESTRICTED CALLER }
JavaScript 핸들러
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) RENAME TO <new_name>
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) SET
[ LOG_LEVEL = '<log_level>' ]
[ TRACE_LEVEL = '<trace_level>' ]
[ COMMENT = '<string_literal>' ]
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) UNSET COMMENT
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) SET TAG <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ]
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) UNSET TAG <tag_name> [ , <tag_name> ... ]
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) EXECUTE AS { OWNER | CALLER | RESTRICTED CALLER }
Python 핸들러
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) RENAME TO <new_name>
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) SET
[ LOG_LEVEL = '<log_level>' ]
[ TRACE_LEVEL = '<trace_level>' ]
[ EXTERNAL_ACCESS_INTEGRATIONS = '<integration_name>' [ , '<integration_name>' ... ] ]
[ SECRETS = '<secret_variable_name>' = <secret_name> [ , '<secret_variable_name>' = <secret_name> ... ] ]
[ COMMENT = '<string_literal>' ]
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) UNSET COMMENT
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) SET TAG <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ]
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) UNSET TAG <tag_name> [ , <tag_name> ... ]
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) EXECUTE AS { OWNER | CALLER | RESTRICTED CALLER }
Scala 핸들러
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) RENAME TO <new_name>
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) SET
[ LOG_LEVEL = '<log_level>' ]
[ TRACE_LEVEL = '<trace_level>' ]
[ EXTERNAL_ACCESS_INTEGRATIONS = '<integration_name>' [ , '<integration_name>' ... ] ]
[ SECRETS = '<secret_variable_name>' = <secret_name> [ , '<secret_variable_name>' = <secret_name> ... ] ]
[ COMMENT = '<string_literal>' ]
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) UNSET COMMENT
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) SET TAG <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ]
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) UNSET TAG <tag_name> [ , <tag_name> ... ]
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) EXECUTE AS { OWNER | CALLER | RESTRICTED CALLER }
Snowflake Scripting 핸들러
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) RENAME TO <new_name>
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) SET
[ AUTO_EVENT_LOGGING = '<option>' ]
[ LOG_LEVEL = '<log_level>' ]
[ TRACE_LEVEL = '<trace_level>' ]
[ COMMENT = '<string_literal>' ]
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) UNSET COMMENT
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) SET TAG <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ]
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) UNSET TAG <tag_name> [ , <tag_name> ... ]
ALTER PROCEDURE [ IF EXISTS ] <name> ( [ <arg_data_type> , ... ] ) EXECUTE AS { OWNER | CALLER | RESTRICTED CALLER }
매개변수 (Parameters)
name — 수정할 저장 프로시저의 식별자를 지정해요. 식별자에 공백이나 특수 문자가 포함되어 있으면 전체 문자열을 큰따옴표로 묶어야 해요. 큰따옴표로 묶은 식별자는 대소문자를 구분해요.
arg_data_type [ , ... ] — 저장 프로시저에 인자가 있으면 그 인자의 데이터 타입을 지정해요. 저장 프로시저는 이름 오버로딩을 지원하므로(즉 같은 스키마의 두 저장 프로시저가 같은 이름을 가질 수 있음) 인자 타입이 필수이며, 수정하려는 프로시저를 식별하는 데 사용돼요.
RENAME TO new_name — 저장 프로시저의 새 식별자를 지정해요. 식별자와 기존 인자 데이터 타입의 조합은 스키마에서 고유해야 해요.
자세한 내용은 식별자 요구사항을 참고하세요.
객체의 이름을 바꾸면서 다른 데이터베이스 및/또는 스키마로 이동할 수 있어요. 그러려면 db_name.schema_name.object_name 또는 schema_name.object_name 형식으로 새 위치가 포함된 정규화된 new_name 값을 지정해요.
참고
- 대상 데이터베이스 및/또는 스키마는 이미 존재해야 해요. 새 위치에 같은 이름의 객체가 이미 있으면 문이 오류를 반환해요.
- 객체 소유자(즉 객체에 OWNERSHIP 권한이 있는 역할)가 대상 스키마도 소유하지 않는 한, 관리형 접근 스키마로의 이동은 금지돼요.
객체 이름을 바꾸면, 그 객체를 참조하는 다른 객체도 새 이름으로 업데이트해야 해요.
SET ... — 저장 프로시저에 설정할 속성을 지정해요.
AUTO_EVENT_LOGGING = 'option' — (Snowflake Scripting 저장 프로시저 전용) 추가적인 Snowflake Scripting 로그 메시지와 추적 이벤트를 이벤트 테이블로 자동 수집할지 여부를 제어해요. 옵션에 대한 정보는 AUTO_EVENT_LOGGING을 참고하세요.
LOG_LEVEL = 'log_level' — 활성 이벤트 테이블에 수집되어 제공할 메시지의 심각도 수준을 지정해요. 지정된 수준(및 그보다 심각한 수준)의 메시지가 수집돼요. 수준에 대한 자세한 내용은 LOG_LEVEL을, 로그 수준 설정에 대해서는 로깅, 메트릭, 추적 수준 설정을 참고하세요.
TRACE_LEVEL = 'trace_level' — 추적 이벤트를 이벤트 테이블로 수집하는 방식을 제어해요. 수준에 대한 정보는 TRACE_LEVEL을, 추적 수준 설정에 대해서는 로깅, 메트릭, 추적 수준 설정을 참고하세요.
EXTERNAL_ACCESS_INTEGRATIONS = ( integration_name [ , ... ] ) — 이 프로시저의 핸들러 코드가 외부 네트워크에 접근하는 데 필요한 외부 접근 통합(external access integrations)의 이름이에요.
외부 접근 통합에는 핸들러 코드가 외부 REST API 같은 외부 네트워크에 요청을 보낼 때 필요한 외부 위치와 자격 증명(있는 경우)을 지정하는 네트워크 규칙과 비밀(secrets)이 포함돼요. 자세한 내용은 외부 네트워크 접근 개요를 참고하세요.
SECRETS = ( 'secret_variable_name' = secret_name [ , ... ] ) — 핸들러 코드에서 비밀에서 정보를 가져올 때 변수로 비밀을 참조할 수 있도록 비밀 이름을 변수에 할당해요.
이 매개변수의 값은 다음 부분으로 구성된 할당 표현식 목록이에요:
-
secret_name: 외부 접근 통합의 ALLOWED_AUTHENTICATION_SECRETS 매개변수 값에 지정된 비밀의 이름. 해당 외부 접근 통합의 이름은 다시 이 CREATE PROCEDURE 호출의 EXTERNAL_ACCESS_INTEGRATIONS 매개변수 값으로 지정되어야 해요.EXTERNAL_ACCESS_INTEGRATIONS 매개변수로 지정한 통합에 포함되지 않은 비밀을 SECRETS 값으로 지정하면 오류가 발생해요.
-
'secret_variable_name': 핸들러 코드에서 비밀에서 정보를 가져올 때 사용할 변수.
COMMENT = 'string_literal' — 저장 프로시저의 주석을 추가하거나 기존 주석을 덮어써요. 지정한 값은 SHOW PROCEDURES 출력의 DESCRIPTION 열에 표시돼요.
TAG tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] — 태그 이름과 태그 문자열 값을 지정해요.
태그 값은 항상 문자열이며, 최대 문자 수는 256이에요. 문에서 태그를 지정하는 방법은 태그 할당량을 참고하세요.
UNSET ... — 저장 프로시저에서 해제할 속성을 지정해 기본값으로 되돌려요.
현재 해제할 수 있는 속성은 다음과 같아요:
COMMENT— 프로시저의 주석(있는 경우)을 제거해요.TAG tag_name [ , tag_name ... ]
EXECUTE AS { OWNER | CALLER | RESTRICTED CALLER } — Preview Feature — 공개. 제한된 호출자 권한(EXECUTE AS RESTRICTED CALLER)은 모든 계정에서 사용할 수 있는 프리뷰 기능이에요.
저장 프로시저가 소유자의 권한으로 실행되는지("owner's rights" 프로시저) 호출자의 권한으로 실행되는지("caller's rights" 프로시저)를 지정해요:
ALTER PROCEDURE … EXECUTE AS OWNER를 실행하면 이후 프로시저는 owner's rights 프로시저로 실행돼요.ALTER PROCEDURE … EXECUTE AS CALLER를 실행하면 이후 프로시저는 caller's rights 프로시저로 실행돼요.ALTER PROCEDURE … EXECUTE AS RESTRICTED CALLER를 실행하면 이후 프로시저는 caller's rights 프로시저로 실행되지만, 호출자의 모든 권한으로는 실행되지 못할 수 있어요. 자세한 내용은 제한된 호출자 권한을 참고하세요.
EXECUTE AS ...를 지정하지 않으면 프로시저는 owner's rights 저장 프로시저로 실행돼요. Owner's rights 저장 프로시저는 호출자 환경(예: 호출자의 세션 변수)에 대한 접근이 적으며, Snowflake는 기본적으로 이 더 높은 수준의 개인정보 보호와 보안을 사용해요. 자세한 내용은 caller's rights와 owner's rights 저장 프로시저 이해를 참고하세요.
기본값: EXECUTE AS OWNER
사용 메모 (Usage notes)
메타데이터 관련: Snowflake 서비스를 사용할 때 메타데이터로 개인 데이터(User 객체 외), 민감한 데이터, 수출 통제 데이터 또는 기타 규제 대상 데이터를 입력하지 않도록 주의해야 해요. 자세한 내용은 Snowflake의 메타데이터 필드를 참고하세요.
예시 (Examples)
저장 프로시저 procedure1의 이름을 procedure2로 변경해요.
ALTER PROCEDURE IF EXISTS procedure1(FLOAT) RENAME TO procedure2;
더 알아보기 (Learn more)
- CREATE PROCEDURE — 저장 프로시저 만들기
- DROP PROCEDURE — 저장 프로시저 삭제
- SHOW PROCEDURES — 저장 프로시저 나열