-------------------------------- 저장 프로시저의 권한 -------------------------------- 이 장에서는 저장 프로시저를 호출하기 위해 필요한 권한과 다른 사용자에게 프로시저에 대한 호출 권한을 부여하는 방법에 대하여 자세히 설명한다. 또한 호출 시 어떤 사용자의 권한으로 호출하는지 명시하는 소유자 권한과 호출자 권한의 차이에 대하여 자세히 설명한다. .. _pl-call-authorization: 프로시저 호출 권한 부여 ============================================ 프로시저를 생성하면 프로시저를 생성한 사용자의 스키마에 속하며, 오직 **소유자**\와 **DBA** 권한을 가진 사용자만이 프로시저를 호출할 수 있다. 프로시저의 소유자가 다른 사용자에게 프로시저에 대한 호출 권한을 부여하면, 해당 사용자는 권한을 부여받은 다른 사용자의 프로시저를 호출할 수 있다. 이 때 주의해야할 점은 구현하는 일련의 루틴에서 권한이 없는 객체를 참조하는 경우에는 컴파일 또는 실행 시 오류가 발생할 수 있다. 따라서 저장 프로시저에서 참조하는 객체에 대해서도 권한이 있는지 확인하는 것이 필요하다. CUBRID에서는 :ref:`GRANT ` 문을 사용하여 프로시저에 대한 호출 권한을 부여할 수 있다. .. code-block:: sql GRANT EXECUTE ON PROCEDURE procedure_name TO user_name; 반대로 :ref:`REVOKE ` 문을 사용하여 프로시저에 대한 호출 권한을 해지할 수 있다. .. code-block:: sql REVOKE EXECUTE ON PROCEDURE procedure_name FROM user_name; .. note:: 저장 프로시저와 저장 함수에 대한 **EXECUTE ON PROCEDURE** 권한은 **WITH GRANT OPTION** 을 지원하지 않는다. 따라서 프로시저의 소유자가 부여한 권한을 다른 사용자에게 부여할 수 없다. .. _pl-authid: 소유자 권한과 호출자 권한의 차이 ============================================ 프로시저의 호출 권한을 가지면, 해당 프로시저를 실행할 때 어떠한 사용자의 권한으로 실행될지 명시할 수 있다. 저장 프로시저와 저장 함수는 **소유자** 권한 또는 **호출자** 권한으로 실행될 수 있다. 실행 권한은 저장 프로시저 또는 저장함수 생성시 둘 중 하나를 선택하여 생성할 수 있으며, 지정한 권한으로 실행된다. 다음은 각 권한에 대한 설명과 차이점을 설명한다. * **소유자 권한** (Owner's Rights 또는 Definer's Rights) * 저장 프로시저를 만든 사용자의 권한으로 실행된다. * 저장 프로시저를 만든 사용자가 다른 사용자에게 권한을 부여하면 부여된 사용자도 저장 프로시저를 실행할 수 있다. * 저장 프로시저의 소유자의 모든 권한을 사용 가능하므로 별도의 권한 부여 없이 소유자가 접근할 수 있는 데이터베이스 객체에 접근할 수 있다. **DBA**\의 소유자 권한으로 저장 프로시저를 만들면 모든 데이터베이스 객체에 접근할 수 있으므로 특히 동적 SQL(Dynamic SQL)을 사용할 때 SQL 인젝션(SQL Injection)과 같은 보안 문제에 주의해야 한다. * 공통적인 작업이나 데이터 접근을 필요로 하는데 적합하다. 반면에 호출자 권한은 다음과 같다. * **호출자 권한** (Caller's Rights 또는 Invoker's Rights) * 저장 프로시저를 만든 사용자의 권한이 아닌 호출자의 권한으로 실행된다. * 호출자 권한으로 저장 프로시저를 만들고 다른 유저에게 권한을 부여하면, 저장 프로시저를 호출하는 사용자의 권한으로 실행된다. * 호출자 권한으로 저장 프로시저를 만들면 저장 프로시저를 만든 사용자의 권한이 아닌 호출자의 권한 수준에서 실행되므로 호출자의 권한으로 데이터베이스 객체에 접근할 수 있다. 따라서 호출자 권한으로 저장 프로시저를 만들 때는 호출자의 권한 수준을 고려하여 저장 프로시저를 만들어야 한다. * 호출자별로 권한을 다르게 적용해야할 경우에 적합하다. 저장 프로시저 생성 시 소유자 권한과 호출자 권한의 차이를 이해하고 저장 프로시저를 활용하면 보다 효율적으로 데이터베이스를 관리할 수 있다. 저장 프로시저 또는 저장 함수 생성 시 **AUTHID** 속성을 지정하여 **소유자 권한** 또는 **호출자 권한** 으로의 동작 여부를 지정할 수 있다. 정의문에 대한 자세한 내용은 :doc:`/sql/schema/stored_routine_stmt`\를 참고한다. **AUTHID** 속성을 다음과 같이 지정할 수 있으며, **DEFINER**\와 **OWNER** 그리고 **CURRENT_USER**\와 **CALLER**\는 동의어이다. * **소유자 권한**: AUTHID DEFINER 또는 AUTHID OWNER * **호출자 권한**: AUTHID CURRENT_USER 또는 AUTHID CALLER 속성을 지정하지 않으면 기본적으로 **소유자 권한**\으로 동작한다. 다음은 DBA 사용자로 로그인하여 :ref:`fn_current_user` 를 반환하는 DBA 소유자 권한의 저장 함수를 만들고 U1 사용자에서 호출하는 예이다. .. code-block:: sql -- DBA로 로그인 CREATE USER U1; CREATE OR REPLACE FUNCTION fn_current_user() RETURN STRING AUTHID DEFINER AS BEGIN RETURN CURRENT_USER; END; GRANT EXECUTE ON PROCEDURE fn_current_user TO U1; CALL login ('U1', '') ON CLASS db_user; SELECT dba.fn_current_user(); :: -- 위와 같이 U1 사용자로 호출했지만, 결과는 'DBA@' 이므로 소유자 권한으로 실행되었음을 알 수 있다. dba.fn_current_user() ====================== 'DBA@' .. warning:: * CUBRID의 PL/CSQL에서는 현재 **소유자 권한** 만을 지원하고 있으며, **호출자 권한**\은 지원하지 않는다. * **호출자 권한**\을 사용하기 위해서는 Java SP를 사용하여 저장 프로시저를 작성해야 한다. .. note:: * **소유자 권한**\은 CUBRID 11.4 버전부터 지원한다.