프로시져, 함수 AUTHID 이해

 

DBADM 계정(DBA용)으로 프로시져를 생성하였다.

프로시져 생성 목적은 타 스키마(HUAM_OWN)의 OBJECT를 관리하기 위함이다.

예시로써, 타 스키마의 인덱스를 재생성하려고 한다. ( DROP & CREATE )

프로시져를 호출했으나 ERROR가 발생한다.

DBADM은 DBA ROLE 권한을 가졌는데 왜 안되는 걸까?

DBA ROLE에 INDEX 관련 SYSTEM 권한 조회

 

 

 

 

 

 

[1] HUAM_OWN 계정 = 스키마

1.1 테이블 & 인덱스 생성

CREATE TABLE HUAM_OWN.TB_TEST_007
( 
  COL1 VARCHAR2(100) 
);
CREATE INDEX HUAM_OWN.IX_TB_TEST_007_01 ON HUAM_OWN.TB_TEST_007 ( COL1 ) ; 
CREATE PUBLIC SYNONYM TB_TEST_007 FOR HUAM_OWN.TB_TEST_007;
 

 

 

 

[2] DBADM 계정

2.1 권한

- SYSTEM 권한 : UNLIMITED TABLESPACE

- ROLE 권한 : CONNECT, RESOURCE, DBA

2.2 OBJECT

- 프로시져 : PRC_INDEX_DROP

CREATE OR REPLACE PROCEDURE PRC_INDEX_DROP
IS
BEGIN  
  EXECUTE IMMEDIATE 'DROP INDEX HUAM_OWN.IX_TB_TEST_007_01';    
  EXECUTE IMMEDIATE 'CREATE INDEX HUAM_OWN.IX_TB_TEST_007_01 ON HUAM_OWN.TB_TEST_007 ( COL1 ) ';  
END PRC_INDEX_DROP;
/
 

 

 

 

[3] 테스트

3.1 DBADM -> PRC_INDEX_DROP 실행

: WHY? 에러가 발생하는 걸까?

EXEC dbadm.PRC_INDEX_DROP; 
[ 에러 발생 ]
ORA-01418: specified index does not exists;
ORA-06512: at "DBADM.PRC_INDEX_DROP", line 4ORA-06512: at line 1
 

 

 

 

3.2 AUTHID 이해

: PL/SQL 프로시져, 함수가 실행될때 어느 사용자의 권한으로 실행 할 지 지정하는 AUTHID 키워드 이해가 필요하다.

  어느 사용자는 "프로시져 소유자" "프로시져 호출자" 2명의 사용자로 구분된다.

  핵심만 정리하면 다음과 같다.

 
 
AUTHID DEFINER(소유자)
AUTHID CURRENT_USER(호출자)
SYSTEM 권한
적용
적용
ROLE 권한
X
적용
OBJECT 권한
적용
적용

※ 프로시져 생성시 AUTHID를 명시하지 않으면, AUTHID DEFINER로 실행됨 (Default DEFINER)

 

 

 

 

 

3.3 에러 발생 원인

: DBADM 계정으로 프로시져 실행시 AUTHID DEFINER(소유자 권한 기준)으로 실행이 된다.

  DBADM이 DBA ROLE 권한은 있지만, DEFINER는 ROLE 권한을 적용하지 않는다.

  그러므로 프로시저 내부에 HUAM_OWN의 인덱스를 DROP & CREATE 하니 에러가 발생한다.

  ROLE 내에 SYSTEM 권한(DROP,CREATE ANY INDEX)과 개별 시스템 권한은 명칭과 역할은 같다.

  하지만, 부여된 타입(Role / System)이 다르기 때문에 발생하는 원인으로 판단하자!

 

 

 

 

3.4 조치 방법 2가지

3.4.1 프로시저에 AUTHID CURRENT_USER 명시

- 호출자 권한으로 실행되기때문에, ROLE 권한까지 적용되므로, 에러 없이 수행 됨

  ( 소유자 "DBADM"이 아닌, 호출자 "DBADM"으로 실행함 )

CREATE OR REPLACE PROCEDURE PRC_INDEX_DROP
authid current_user -- <--------------------------명시!!!
IS
BEGIN  
  EXECUTE IMMEDIATE 'DROP INDEX HUAM_OWN.IX_TB_TEST_007_01';    
  EXECUTE IMMEDIATE 'CREATE INDEX HUAM_OWN.IX_TB_TEST_007_01 ON HUAM_OWN.TB_TEST_007 ( COL1 ) ';  
END PRC_INDEX_DROP;
/  
 

 

 

3.4.2 프로시져 수정 없이 SYSTEM 권한 부여

- DRA ROLE에 CREATE/DROP ANY INDEX 권한은 있으나,

  AUTHID DEFINER 상태에서는 ROLE 권한이 배제되므로 별도 SYSTEM 권한을 부여하는 방법이다. 

  아래 수행 후 프로시져 실행시 정상 수행 됨

GRANT CREATE ANY INDEX, CREATE DROP INDEX TO DBADM;
 

 

 

※ 참고

: 프로젝트 상황에 따라 사용하면 되겠지만, DBA 계정으로 OBJECT를 관리하는 경우에는

 1) AUTHID CURRENT_USER로 사용하는 것이 권장된다.

 

'ORACLE > DBA' 카테고리의 다른 글

FUNCTION BASED(함수기반) INDEX 컬럼명 조회  (0) 2024.10.24
인덱스 사용 여부 확인  (0) 2024.10.20
ORACLE SYSTEM, ROLE, OBJECT 권한 조회  (0) 2024.10.19
오라클 힌트 목록  (0) 2024.09.23
인덱스 invisible, visible 변경  (0) 2024.09.23