> For the complete documentation index, see [llms.txt](https://docs.tibero.com/tibero-manuals/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tibero.com/tibero-manuals/7.2.6.manuals/tbpsm-reference-guide/dbms_rls.md).

# DBMS\_RLS

DBMS\_RLS 패키지의 기본 개념과 패키지 내의 프러시저와 함수를 사용하는 방법을 설명합니다.

## **개요**

**DBMS\_RLS** 패키지는 Tibero의 가상 개인 데이터베이스(VPD, virtual private database) 기능을 구성하고 관리하는 프러시저를 제공합니다.

가상 개인 데이터베이스에서는 테이블, 뷰, 동의어에 대해 동적으로 조건문을 생성하여 해당 스키마 객체에서 반환하는 로우에 대한 접근을 선택적으로 제한합니다. 동적 조건문은 문자열을 반환하는 PSM 함수를 통해 만들 수 있으며, 이 함수를 추가되는 보안 정책과 연결시켜 줌으로써 정책이 구현됩니다.

다음은 예시입니다.

```
BEGIN
    DBMS_RLS.ADD_POLICY ('RLS11_ADMIN', 'RLS11_EMP', 'RLS11_EMP_POL',
                         'RLS11_ADMIN', 'RLS11_EMP_SEC', 'select');
END;
/
```

RLS11\_EMP\_POL이라는 정책을 통해 RLS11\_ADMIN 스키마의 RLS11\_EMP 테이블을 SELECT할 때마다 Tibero는 RLS11\_ADMIN의 RLS11\_EMP\_SEC 함수를 호출하여 조건문을 동적으로 만들게 되고, 그 조건문을 WHERE 절로 추가하여 실제 SELECT를 수행합니다.

동적 조건문을 생성하기 위해 현재의 상황(혹은 조건)을 조사할 필요가 생기는데, 이때 보통 애플리케이션 문맥 기능을 이용합니다. 해당 내용은 DBMS\_SESSION 패키지 및 SYS\_CONTEXT 내장 함수를 참조합니다.

**DBMS\_RLS**를 사용할 때 알아 두어야 할 사항은 다음과 같습니다.

* 정책은 데이터 딕셔너리에 저장되므로 세션 범위가 아니며, 정책을 만든 세션이 종료된 뒤에도 유지됩니다. ADD\_POLICY, DROP\_POLICY, ENABLE\_POLICY 프러시저는 호출 시점에 현재 트랜잭션을 커밋합니다.
* 정책을 적용할 수 있는 객체는 테이블, 뷰, 동의어입니다. 프러시저, 패키지, 시퀀스, 오브젝트 타입처럼 이 세 종류가 아닌 객체를 지정하면 TBR-12114가, 존재하지 않는 이름이나 인덱스처럼 테이블 네임스페이스에 없는 객체를 지정하면 TBR-7071이 발생합니다.
* 정책은 지정한 객체 자체에만 적용됩니다. 동의어에 추가한 정책은 그 동의어를 통해 접근할 때만 적용되고, 같은 데이터를 기반 테이블 이름으로 직접 조회하면 적용되지 않습니다.
* SYS 스키마에서 수행하는 문장에는 정책이 적용되지 않습니다. 정책의 동작을 확인할 때는 SYS가 아닌 사용자로 접속해야 합니다.
* 하나의 객체에 정책을 여러 개 추가할 수 있으며, 이때 각 정책 함수가 반환한 조건문은 AND로 결합됩니다.
* 정책 함수가 NULL을 반환하면 해당 정책은 조건문을 추가하지 않으므로 모든 로우가 반환됩니다.
* SYS 이외의 사용자가 사용하려면 SYS.DBMS\_RLS에 대한 EXECUTE 권한이 필요합니다. 권한이 없으면 TBR-15146과 함께 TBR-7071이 발생합니다.
* ADD\_POLICY 프러시저는 VPD 기능의 라이선스를 확인하며, 라이선스가 없으면 TBR-110003이 발생합니다.
* ADD\_POLICY 프러시저는 정책 함수의 존재 여부와 반환 타입을 검사하지 않습니다. 잘못된 함수 이름이나 스키마를 지정해도 정책은 추가되고, 대상 객체를 조회하는 시점에 TBR-7068, TBR-7071 또는 TBR-12113이 발생합니다.
* 정의된 정책은 DBA\_POLICIES, ALL\_POLICIES, USER\_POLICIES 뷰로 조회할 수 있습니다. 정책 함수의 결과가 저장된 캐시는 V$VPD\_STATIC\_CACHE, V$VPD\_CONTEXT\_SENSITIVE\_CACHE 뷰로, 문장에 실제로 적용된 조건문은 V$VPD\_POLICY 뷰로 확인할 수 있습니다.
* DBA\_POLICIES 뷰의 STATIC\_POLICY 컬럼은 static\_policy 파라미터 값이 아니라 결정된 정책 유형이 STATIC인지를 나타냅니다. IDX 컬럼은 인덱스 관리 작업에 대한 정책 적용 여부를 나타내며 항상 NO입니다.

## **상수**

본 절에서는 DBMS\_RLS 패키지에서 제공하는 상수를 설명합니다. 모든 상수는 PLS\_INTEGER 타입입니다.

* ADD\_POLICY의 policy\_type 파라미터 상수

<table><thead><tr><th width="250">상수</th><th width="70">값</th><th>설명</th></tr></thead><tbody><tr><td>STATIC</td><td>1</td><td><ul><li>반환되는 조건문이 운영 중인 상황과 무관할 때 사용</li><li>정책 함수는 대상 객체별로 한 번만 수행되며 그 결과는 공유 메모리에 저장되어 다른 세션에서도 재사용됨</li><li>정책 함수가 참조하는 데이터가 바뀌어도 저장된 조건문이 계속 사용됨</li></ul></td></tr><tr><td>SHARED_STATIC</td><td>2</td><td><ul><li>STATIC과 동일하나 대상 스키마 객체와 무관하게 이전에 해당 정책 함수를 수행한 적이 있으면 그 결과를 재사용</li></ul></td></tr><tr><td>CONTEXT_SENSITIVE</td><td>3</td><td><ul><li>정책 함수의 결과를 세션 단위로 저장하고, 애플리케이션 문맥이 바뀌면 저장된 결과를 버리고 정책 함수를 다시 수행</li><li>저장된 조건문은 세션 종료와 함께 삭제됨</li></ul></td></tr><tr><td>SHARED_CONTEXT_SENSITIVE</td><td>4</td><td><ul><li>CONTEXT_SENSITIVE와 동일하나 대상 스키마 객체와 무관하게 이전에 해당 정책 함수를 수행한 적이 있으면 그 결과를 재사용</li></ul></td></tr><tr><td>DYNAMIC</td><td>5</td><td><ul><li>정책 함수의 결과를 저장하지 않고 항상 다시 수행</li><li>policy_type과 static_policy를 모두 생략했을 때 결정되는 정책 유형</li></ul></td></tr></tbody></table>

* ADD\_POLICY의 sec\_relevant\_cols\_opt 파라미터 상수

<table><thead><tr><th width="250">상수</th><th width="70">값</th><th>설명</th></tr></thead><tbody><tr><td>ALL_ROWS</td><td>1</td><td><ul><li>컬럼 레벨 VPD에서 조건문을 만족하지 않는 로우도 반환하고, sec_relevant_cols에 명시한 컬럼의 값만 NULL로 가림</li><li>sec_relevant_cols를 지정할 때 이 상수를 함께 지정해야 함</li></ul></td></tr></tbody></table>

## **예외**

**DBMS\_RLS**는 다음 에러를 발생시킵니다.

<table><thead><tr><th width="130">에러 코드</th><th>발생 조건</th></tr></thead><tbody><tr><td>TBR-7068</td><td>object_schema에 존재하지 않는 스키마를 지정. function_schema에 존재하지 않는 스키마를 지정한 경우에는 대상 객체를 조회하는 시점에 발생</td></tr><tr><td>TBR-7071</td><td>object_name에 존재하지 않는 객체 또는 인덱스처럼 테이블 네임스페이스에 없는 객체를 지정. policy_function에 존재하지 않는 함수를 지정한 경우에는 대상 객체를 조회하는 시점에 발생</td></tr><tr><td>TBR-10067</td><td>update_check가 TRUE인 정책이 걸린 객체에 조건문을 만족하지 않는 값을 INSERT 또는 UPDATE</td></tr><tr><td>TBR-12113</td><td>정책 함수가 오류 상태이거나 VARCHAR2를 반환하지 않음. 대상 객체를 조회하는 시점에 발생</td></tr><tr><td>TBR-12114</td><td>테이블, 뷰, 동의어가 아닌 객체(프러시저, 패키지, 시퀀스, 오브젝트 타입 등)를 지정</td></tr><tr><td>TBR-14002</td><td>ADD_POLICY의 object_name, policy_name, policy_function 중 하나를 NULL로 지정. DROP_POLICY와 ENABLE_POLICY의 object_name, policy_name을 NULL로 지정. 이 파라미터들에는 기본값이 없으므로 생략하면 호출 자체가 컴파일되지 않고 TBR-15146과 함께 TBR-15039가 발생</td></tr><tr><td>TBR-14141</td><td>존재하지 않는 정책에 DROP_POLICY, ENABLE_POLICY, REFRESH_POLICY를 수행</td></tr><tr><td>TBR-14142</td><td>같은 객체에 같은 이름의 정책을 다시 추가</td></tr><tr><td>TBR-14151</td><td>비활성화된 정책에 REFRESH_POLICY를 수행</td></tr><tr><td>TBR-14157</td><td>동의어에 sec_relevant_cols를 지정</td></tr><tr><td>TBR-14158</td><td>sec_relevant_cols에 대상 객체에 없는 컬럼 이름을 지정</td></tr><tr><td>TBR-15001</td><td>sec_relevant_cols를 지정하고 sec_relevant_cols_opt를 지정하지 않거나 NULL로 지정</td></tr><tr><td>TBR-15079</td><td>statement_types에 SELECT, INSERT, UPDATE, DELETE 이외의 값을 지정</td></tr><tr><td>TBR-110003</td><td>VPD 기능에 대한 라이선스가 없음</td></tr></tbody></table>

sec\_relevant\_cols 처리 중에 TBR-14157, TBR-14158, TBR-15001이 발생하면 정책은 추가되지 않습니다.

## **프러시저**

본 절에서는 DBMS\_RLS 패키지에서 제공하는 프러시저를 알파벳 순으로 설명합니다. DBMS\_RLS 패키지에는 함수가 없습니다.

정책의 동작을 확인하기 위해 권한을 가진 사용자(SYS 등)를 통해 다음과 같이 사용자, 테이블, 정책 함수를 준비할 수 있습니다. 본 절의 예제는 모두 이 준비 과정을 먼저 수행한 것을 전제로 합니다.

* 예제

```
CREATE USER RLS11_ADMIN IDENTIFIED BY 'tibero';
GRANT CONNECT, RESOURCE TO RLS11_ADMIN;
GRANT EXECUTE ON SYS.DBMS_RLS TO RLS11_ADMIN;

CREATE TABLE RLS11_ADMIN.RLS11_EMP (
    EMPNO   NUMBER,
    ENAME   VARCHAR2(20),
    DEPTNO  NUMBER,
    SAL     NUMBER);
INSERT INTO RLS11_ADMIN.RLS11_EMP VALUES (1, 'KIM',  10, 1000);
INSERT INTO RLS11_ADMIN.RLS11_EMP VALUES (2, 'LEE',  20, 2000);
INSERT INTO RLS11_ADMIN.RLS11_EMP VALUES (3, 'PARK', 10, 3000);
COMMIT;

CREATE OR REPLACE FUNCTION RLS11_ADMIN.RLS11_EMP_SEC (
    object_schema IN VARCHAR2, object_name IN VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
    RETURN 'DEPTNO = 10';
END;
/

CREATE USER RLS11_USER IDENTIFIED BY 'tibero';
GRANT CONNECT TO RLS11_USER;
GRANT SELECT, INSERT, UPDATE, DELETE ON RLS11_ADMIN.RLS11_EMP TO RLS11_USER;
GRANT EXECUTE ON RLS11_ADMIN.RLS11_EMP_SEC TO RLS11_USER;
```

### **ADD\_POLICY**

해당 테이블, 뷰, 동의어에 대해 가상 개인 데이터베이스 보안 정책을 추가합니다. 이 프러시저는 호출됨과 동시에 현재 트랜잭션을 커밋합니다.

정책 함수는 다음의 함수 프로토타입에 맞추어 작성해야만 합니다.

```
FUNCTION policy_function (object_schema IN VARCHAR2, object_name IN VARCHAR2)
RETURN VARCHAR2;
```

object\_schema, object\_name에는 해당 정책을 적용한 테이블, 뷰, 동의어의 스키마 이름과 객체 이름이 전달됩니다.

정책 함수의 존재 여부와 반환 타입은 이 프러시저에서 검사하지 않고 대상 객체를 조회하는 시점에 검사합니다. 따라서 잘못된 정책 함수를 지정하면 ADD\_POLICY는 성공하고 이후 조회에서 TBR-12113과 같은 에러가 발생합니다.

ADD\_POLICY 프러시저의 세부 내용은 다음과 같습니다.

* 프로토타입

```
DBMS_RLS.ADD_POLICY
(
   object_schema              IN VARCHAR2 DEFAULT NULL,
   object_name                IN VARCHAR2,
   policy_name                IN VARCHAR2,
   function_schema            IN VARCHAR2 DEFAULT NULL,
   policy_function            IN VARCHAR2,
   statement_types            IN VARCHAR2 DEFAULT NULL,
   update_check               IN BOOLEAN DEFAULT FALSE,
   enable                     IN BOOLEAN DEFAULT TRUE,
   static_policy              IN BOOLEAN DEFAULT FALSE,
   policy_type                IN BINARY_INTEGER DEFAULT NULL,
   sec_relevant_cols          IN VARCHAR2 DEFAULT NULL,
   sec_relevant_cols_opt      IN BINARY_INTEGER DEFAULT NULL
);
```

* 파라미터

<table><thead><tr><th width="192">파라미터</th><th>설명</th></tr></thead><tbody><tr><td>object_schema</td><td><ul><li>테이블, 뷰, 동의어를 가지고 있는 스키마</li><li>명시하지 않으면 현재 사용자의 스키마</li><li>존재하지 않는 스키마를 지정하면 TBR-7068 발생</li></ul></td></tr><tr><td>object_name</td><td><ul><li>테이블, 뷰, 동의어의 이름</li><li>NULL로 지정하면 TBR-14002 발생</li><li>테이블, 뷰, 동의어가 아닌 객체를 지정하면 TBR-12114 발생</li></ul></td></tr><tr><td>policy_name</td><td><ul><li>새로 추가하고자 하는 정책의 이름</li><li>해당 스키마 객체에 대해 유일해야 함. 같은 이름이 이미 있으면 TBR-14142 발생</li><li>NULL로 지정하면 TBR-14002 발생</li></ul></td></tr><tr><td>function_schema</td><td><ul><li>조건문 생성 함수의 스키마</li><li>명시하지 않으면 현재 사용자의 스키마</li><li>이 프러시저에서는 검사하지 않으며, 존재하지 않는 스키마를 지정하면 대상 객체를 조회할 때 TBR-7068 발생</li></ul></td></tr><tr><td>policy_function</td><td><ul><li>조건문 생성 함수의 이름</li><li>패키지 내에 존재하면 패키지 이름과 함께 명시</li><li>NULL로 지정하면 TBR-14002 발생</li></ul></td></tr><tr><td>statement_types</td><td><ul><li>정책을 적용할 SQL 문의 유형</li><li>SELECT, INSERT, UPDATE, DELETE의 조합을 쉼표로 구분하여 명시할 수 있음</li><li>명시하지 않으면 이 4개를 모두 명시한 것과 같음. 프로토타입의 기본값은 NULL이지만 내부에서 4개 유형으로 채워짐</li><li>4개 이외의 값을 지정하면 TBR-15079 발생</li></ul></td></tr><tr><td>update_check</td><td><ul><li>INSERT, UPDATE인 경우에 적용</li><li>TRUE일 경우 새로 INSERT되거나 UPDATE된 값이 정책의 조건문을 만족하는지 검사하며, 만족하지 않으면 TBR-10067 발생(기본값: FALSE)</li></ul></td></tr><tr><td>enable</td><td><ul><li>정책을 추가함과 동시에 활성화할지 명시(기본값: TRUE)</li><li>FALSE로 만든 정책은 ENABLE_POLICY 프러시저로 활성화</li></ul></td></tr><tr><td>static_policy</td><td><ul><li>정책 유형을 설정</li><li>policy_type이 지정되지 않을 경우에만 유효</li><li>FALSE: DYNAMIC(기본값)</li><li>TRUE: STATIC</li></ul></td></tr><tr><td>policy_type</td><td><ul><li>정책 유형을 설정(기본값: NULL)</li><li>지정할 수 있는 값은 "상수"에 설명한 DBMS_RLS.STATIC, DBMS_RLS.SHARED_STATIC, DBMS_RLS.CONTEXT_SENSITIVE, DBMS_RLS.SHARED_CONTEXT_SENSITIVE, DBMS_RLS.DYNAMIC</li><li>NULL이면 static_policy 값에 따라 STATIC 또는 DYNAMIC으로 결정됨</li><li>이 값들 이외의 값은 지정하지 않음</li></ul></td></tr><tr><td>sec_relevant_cols</td><td><ul><li>컬럼 레벨 VPD 기능을 활성화</li><li>조건문 함수의 결과에 따라 값을 NULL로 가릴 컬럼 이름을 명시</li><li>이름은 쉼표 또는 공백 문자로 구분할 수 있음</li><li>이 인자는 테이블 또는 뷰에 대해 명시할 수 있으며, 동의어에 대해 명시하면 TBR-14157 발생</li><li>대상 객체에 없는 컬럼 이름을 지정하면 TBR-14158 발생</li><li>기본값은 NULL이며, 이 경우 컬럼 레벨 VPD 기능을 사용하지 않음</li></ul></td></tr><tr><td>sec_relevant_cols_opt</td><td><ul><li>지정할 수 있는 값은 NULL(기본값) 또는 DBMS_RLS.ALL_ROWS</li><li>sec_relevant_cols 인자를 통해 컬럼 레벨 VPD 기능을 활성화했을 경우 이 인자의 값은 DBMS_RLS.ALL_ROWS이어야 하며, 그렇지 않으면 TBR-15001 발생</li><li>sec_relevant_cols를 지정하지 않았을 때는 이 인자도 지정하지 않음</li></ul></td></tr></tbody></table>

* 예제

정책을 추가한 뒤 DBA\_POLICIES 뷰로 확인합니다.

```
BEGIN
    DBMS_RLS.ADD_POLICY (
        object_schema   => 'RLS11_ADMIN',
        object_name     => 'RLS11_EMP',
        policy_name     => 'RLS11_EMP_POL',
        function_schema => 'RLS11_ADMIN',
        policy_function => 'RLS11_EMP_SEC',
        statement_types => 'select,update');
END;
/
```

```
COLUMN policy_name FORMAT A16
SELECT policy_name, sel, upd, chk_option, enable, policy_type
    FROM dba_policies
    WHERE object_owner = 'RLS11_ADMIN' AND object_name = 'RLS11_EMP';
```

```
POLICY_NAME      SEL UPD CHK_OPTION ENABLE POLICY_TYPE
---------------- --- --- ---------- ------ ------------------------
RLS11_EMP_POL    YES YES NO         YES    DYNAMIC

1 row selected.
```

RLS11\_USER로 접속해 조회하면 DEPTNO가 10인 로우만 반환됩니다.

```
CONN RLS11_USER/tibero
COLUMN ename FORMAT A8
SELECT empno, ename, deptno, sal FROM RLS11_ADMIN.RLS11_EMP ORDER BY empno;
```

```
     EMPNO ENAME        DEPTNO        SAL
---------- -------- ---------- ----------
         1 KIM              10       1000
         3 PARK             10       3000

2 rows selected.
```

– 컬럼 레벨 VPD를 사용하는 경우

앞의 예제에서 추가한 정책을 제거한 뒤, sec\_relevant\_cols에 SAL 컬럼을 지정하고 sec\_relevant\_cols\_opt에 DBMS\_RLS.ALL\_ROWS를 지정합니다.

```
CONN SYS/tibero
BEGIN
    DBMS_RLS.DROP_POLICY ('RLS11_ADMIN', 'RLS11_EMP', 'RLS11_EMP_POL');
    DBMS_RLS.ADD_POLICY (
        object_schema         => 'RLS11_ADMIN',
        object_name           => 'RLS11_EMP',
        policy_name           => 'RLS11_EMP_COL_POL',
        function_schema       => 'RLS11_ADMIN',
        policy_function       => 'RLS11_EMP_SEC',
        statement_types       => 'select',
        sec_relevant_cols     => 'SAL',
        sec_relevant_cols_opt => DBMS_RLS.ALL_ROWS);
END;
/
```

RLS11\_USER로 접속해 조회하면 모든 로우가 반환되고, 조건문을 만족하지 않는 로우의 SAL 값만 NULL로 가려집니다.

```
CONN RLS11_USER/tibero
COLUMN ename FORMAT A8
SELECT empno, ename, deptno, sal FROM RLS11_ADMIN.RLS11_EMP ORDER BY empno;
```

```
     EMPNO ENAME        DEPTNO        SAL
---------- -------- ---------- ----------
         1 KIM              10       1000
         2 LEE              20
         3 PARK             10       3000

3 rows selected.
```

– update\_check를 사용하는 경우

statement\_types에 INSERT와 UPDATE를 지정하고 update\_check를 TRUE로 지정합니다.

```
CONN SYS/tibero
BEGIN
    DBMS_RLS.DROP_POLICY ('RLS11_ADMIN', 'RLS11_EMP', 'RLS11_EMP_COL_POL');
    DBMS_RLS.ADD_POLICY (
        object_schema   => 'RLS11_ADMIN',
        object_name     => 'RLS11_EMP',
        policy_name     => 'RLS11_EMP_POL',
        function_schema => 'RLS11_ADMIN',
        policy_function => 'RLS11_EMP_SEC',
        statement_types => 'insert,update',
        update_check    => TRUE);
END;
/
```

RLS11\_USER로 접속해 조건문을 만족하지 않는 값을 INSERT하면 TBR-10067이 발생하고, 조건문을 만족하는 값은 정상적으로 INSERT됩니다.

```
CONN RLS11_USER/tibero
INSERT INTO RLS11_ADMIN.RLS11_EMP VALUES (4, 'CHOI', 20, 4000);
INSERT INTO RLS11_ADMIN.RLS11_EMP VALUES (5, 'JUNG', 10, 5000);
ROLLBACK;
```

```
TBR-10067: The policy check constraint is violated.


1 row inserted.


Rollback completed.
```

### **DROP\_POLICY**

해당 테이블, 뷰, 동의어에 대해 걸려 있는 가상 개인 데이터베이스 보안 정책을 제거합니다. 이 프러시저는 호출됨과 동시에 현재 트랜잭션을 커밋합니다.

존재하지 않는 정책을 지정하면 TBR-14141이 발생합니다.

DROP\_POLICY 프러시저의 세부 내용은 다음과 같습니다.

* 프로토타입

```
DBMS_RLS.DROP_POLICY
(
    object_schema    IN VARCHAR2 DEFAULT NULL,
    object_name      IN VARCHAR2,
    policy_name      IN VARCHAR2
);
```

* 파라미터

<table><thead><tr><th width="218">파라미터</th><th>설명</th></tr></thead><tbody><tr><td>object_schema</td><td><ul><li>테이블, 뷰, 동의어를 가지고 있는 스키마</li><li>명시하지 않으면 현재 사용자의 스키마</li></ul></td></tr><tr><td>object_name</td><td><ul><li>테이블, 뷰, 동의어의 이름</li><li>NULL로 지정하면 TBR-14002 발생</li></ul></td></tr><tr><td>policy_name</td><td><ul><li>제거하고자 하는 정책의 이름</li><li>NULL로 지정하면 TBR-14002 발생</li><li>존재하지 않는 정책 이름을 지정하면 TBR-14141 발생</li></ul></td></tr></tbody></table>

* 예제

```
CONN SYS/tibero
BEGIN
    DBMS_RLS.DROP_POLICY (
        object_schema => 'RLS11_ADMIN',
        object_name   => 'RLS11_EMP',
        policy_name   => 'RLS11_EMP_POL');
END;
/
```

```
SELECT count(*) AS policy_cnt FROM dba_policies
    WHERE object_owner = 'RLS11_ADMIN';
```

```
POLICY_CNT
----------
         0

1 row selected.
```

### **ENABLE\_POLICY**

해당 테이블, 뷰, 동의어에 대해 걸려 있는 가상 개인 데이터베이스 보안 정책을 활성화 혹은 비활성화합니다. 이 프러시저는 호출됨과 동시에 현재 트랜잭션을 커밋합니다.

비활성화된 정책은 조건문을 추가하지 않으므로 대상 객체의 모든 로우가 반환됩니다. 존재하지 않는 정책을 지정하면 TBR-14141이 발생합니다.

ENABLE\_POLICY 프러시저의 세부 내용은 다음과 같습니다.

* 프로토타입

```
DBMS_RLS.ENABLE_POLICY
(
    object_schema   IN VARCHAR2 DEFAULT NULL,
    object_name     IN VARCHAR2,
    policy_name     IN VARCHAR2,
    enable          IN BOOLEAN DEFAULT TRUE
);
```

* 파라미터

<table><thead><tr><th width="212">파라미터</th><th>설명</th></tr></thead><tbody><tr><td>object_schema</td><td><ul><li>테이블, 뷰, 동의어를 가지고 있는 스키마</li><li>명시하지 않으면 현재 사용자의 스키마</li></ul></td></tr><tr><td>object_name</td><td><ul><li>테이블, 뷰, 동의어의 이름</li><li>NULL로 지정하면 TBR-14002 발생</li></ul></td></tr><tr><td>policy_name</td><td><ul><li>활성화 혹은 비활성화할 정책의 이름</li><li>NULL로 지정하면 TBR-14002 발생</li><li>존재하지 않는 정책 이름을 지정하면 TBR-14141 발생</li></ul></td></tr><tr><td>enable</td><td><ul><li>TRUE: 정책을 활성화(기본값)</li><li>FALSE: 정책을 비활성화</li></ul></td></tr></tbody></table>

* 예제

DROP\_POLICY 예제에서 제거한 정책을 다시 추가한 뒤 비활성화하고, DBA\_POLICIES 뷰로 확인합니다.

```
BEGIN
    DBMS_RLS.ADD_POLICY (
        object_schema   => 'RLS11_ADMIN',
        object_name     => 'RLS11_EMP',
        policy_name     => 'RLS11_EMP_POL',
        function_schema => 'RLS11_ADMIN',
        policy_function => 'RLS11_EMP_SEC',
        statement_types => 'select,update');
    DBMS_RLS.ENABLE_POLICY (
        object_schema => 'RLS11_ADMIN',
        object_name   => 'RLS11_EMP',
        policy_name   => 'RLS11_EMP_POL',
        enable        => FALSE);
END;
/
```

```
SELECT enable FROM dba_policies
    WHERE object_owner = 'RLS11_ADMIN' AND policy_name = 'RLS11_EMP_POL';
```

```
ENABLE
------
NO

1 row selected.
```

RLS11\_USER로 접속해 조회하면 조건문이 적용되지 않아 모든 로우가 반환됩니다.

```
CONN RLS11_USER/tibero
COLUMN ename FORMAT A8
SELECT empno, ename, deptno, sal FROM RLS11_ADMIN.RLS11_EMP ORDER BY empno;
```

```
     EMPNO ENAME        DEPTNO        SAL
---------- -------- ---------- ----------
         1 KIM              10       1000
         2 LEE              20       2000
         3 PARK             10       3000

3 rows selected.
```

예제 수행에 사용한 오브젝트는 다음과 같이 정리합니다.

```
CONN SYS/tibero
BEGIN
    DBMS_RLS.DROP_POLICY ('RLS11_ADMIN', 'RLS11_EMP', 'RLS11_EMP_POL');
END;
/
DROP USER RLS11_USER CASCADE;
DROP USER RLS11_ADMIN CASCADE;
```

```
PSM completed.


User 'RLS11_USER' dropped.


User 'RLS11_ADMIN' dropped.
```

### **REFRESH\_POLICY**

이 프러시저를 호출하면 해당 보안 정책으로 인해 영향을 받았던 실행 계획들과 메모리에 저장되어 있던 정책 함수의 결과들을 모두 무효화시킵니다. 결과적으로 SQL 문이 다시 수행될 때 문장은 다시 파싱되며, 정책 함수는 다시 수행됩니다.

비활성화된 정책에 대해 이 프러시저를 호출하면 TBR-14151이 발생하고, 존재하지 않는 정책을 지정하면 TBR-14141이 발생합니다.

활성화된 정책에 이 프러시저를 호출하면 호출한 세션이 이후 문장을 수행하지 못하고 대기 상태에 들어갑니다.

REFRESH\_POLICY 프러시저의 세부 내용은 다음과 같습니다.

* 프로토타입

```
DBMS_RLS.REFRESH_POLICY
(
    object_schema     IN VARCHAR2 DEFAULT NULL,
    object_name       IN VARCHAR2 DEFAULT NULL,
    policy_name       IN VARCHAR2 DEFAULT NULL
);
```

* 파라미터

<table><thead><tr><th width="208">파라미터</th><th>설명</th></tr></thead><tbody><tr><td>object_schema</td><td><ul><li>테이블, 뷰, 동의어를 가지고 있는 스키마</li><li>명시하지 않으면 현재 사용자의 스키마</li></ul></td></tr><tr><td>object_name</td><td><ul><li>테이블, 뷰, 동의어의 이름</li><li>프로토타입의 기본값은 NULL이지만 대상 객체를 찾을 수 없으므로 반드시 명시</li></ul></td></tr><tr><td>policy_name</td><td><ul><li>다시 수행하려는 정책의 이름</li><li>프로토타입의 기본값은 NULL이지만 정책을 찾을 수 없으므로 반드시 명시</li><li>존재하지 않는 정책 이름을 지정하면 TBR-14141 발생</li><li>비활성화된 정책을 지정하면 TBR-14151 발생</li></ul></td></tr></tbody></table>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.tibero.com/tibero-manuals/7.2.6.manuals/tbpsm-reference-guide/dbms_rls.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
