> 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_fga.md).

# DBMS\_FGA

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

## **개요**

**DBMS\_FGA** 패키지는 FGA(fine-grained auditing) 정책을 관리하는 프러시저를 제공합니다.

FGA는 테이블 또는 뷰에서 특정 조건을 만족하는 데이터에 대한 SQL 동작을 감시하는 보안 기능입니다. 감시 대상 데이터와 SQL 동작은 FGA 정책 단위로 정의하고 관리합니다. 감시 대상 데이터는 SQL WHERE 절의 조건식 또는 컬럼 이름을 통해 각각 행 단위 또는 열 단위로 특정할 수 있습니다. 정책이 감시할 수 있는 SQL 구문 타입은 SELECT, INSERT, UPDATE, DELETE입니다. MERGE 구문은 내부에서 수행된 SQL 구문 타입에 따라 감시 여부가 결정되며, 이때 감시 기록의 STATEMENT\_TYPE은 SELECT로 남습니다.

감시 기록은 `SYS.FGA_LOG$` 테이블에 남습니다. 정책과 감시 기록은 다음 정적 뷰로 확인합니다.

<table><thead><tr><th width="240">뷰</th><th>설명</th></tr></thead><tbody><tr><td>DBA_AUDIT_POLICIES</td><td>데이터베이스에 등록된 모든 FGA 정책의 정의와 활성 여부</td></tr><tr><td>DBA_FGA_AUDIT_TRAIL</td><td>FGA 정책이 남긴 모든 감시 기록</td></tr></tbody></table>

감시 기록은 하나의 구문 실행에 대해 정책별로 최대 1건입니다. 조건을 만족하는 행이 여러 개여도 기록은 1건이며, 같은 구문을 다시 수행하면 다시 1건이 남습니다. 각 기록에는 세션 내 일련 번호가 DBA\_FGA\_AUDIT\_TRAIL의 ENTRYID 컬럼으로 부여됩니다.

감시 기록은 정책을 삭제해도 남고 계속 누적됩니다. 특정 수행분만 확인하려면 DBA\_FGA\_AUDIT\_TRAIL의 SESSION\_ID 또는 TIMESTAMP 컬럼으로 범위를 좁혀야 합니다. 현재 세션의 SESSION\_ID는 SYS\_CONTEXT('USERENV', 'SESSIONID')로 얻을 수 있습니다.

감시 기록의 저장 테이블스페이스 변경, 파티션 간격 변경, 정리(purge)는 **DBMS\_AUDIT\_MGMT** 패키지가 담당합니다. FGA 감사 추적은 그 패키지에서 AUDIT\_TRAIL\_FGA\_STD 유형에 해당합니다. 마지막 아카이브 시각을 기준으로 정리하는 경우 FGA 감사 추적도 표준 감사 추적 유형(AUDIT\_TRAIL\_AUD\_STD)에 설정된 시각을 사용하므로, FGA 감사 기록만 정리할 때에도 AUDIT\_TRAIL\_AUD\_STD의 마지막 아카이브 시각이 설정되어 있어야 합니다.

**DBMS\_FGA**는 SYS 소유이며 정의자 권한(definer rights)으로 수행됩니다. 패키지에 대한 EXECUTE 권한만 있으면 대상 오브젝트에 대한 별도의 오브젝트 권한 없이도 정책을 만들고 지울 수 있으므로, EXECUTE 권한은 제한적으로 부여해야 합니다. 정책을 만든 세션의 사용자가 DBA\_AUDIT\_POLICIES의 POLICY\_OWNER로 기록됩니다.

정책을 사용할 때에는 다음을 함께 고려해야 합니다.

* object\_schema는 항상 명시해야 합니다. 생략하거나 NULL로 지정하면 네 프러시저 모두 실패합니다. SYS로 접속한 세션에서는 TBR-14301, 그 밖의 세션에서는 TBR-7001 에러가 발생합니다.
* SYS 스키마의 오브젝트에는 정책을 만들 수 없습니다. 시도하면 TBR-14301 에러가 발생합니다.
* SYS로 접속한 세션이 수행한 SQL은 정책이 활성 상태여도 감시되지 않습니다.
* 하나의 오브젝트에 만들 수 있는 정책은 최대 256개입니다.
* 정책 이름은 오브젝트 단위로 유일해야 합니다. 서로 다른 오브젝트에는 같은 이름의 정책을 만들 수 있습니다.
* 정책은 딕셔너리에 영속하며 세션이 끝나도 남습니다. 대상 오브젝트를 DROP하면 정책도 함께 삭제됩니다.
* 정책이 있는 오브젝트에 대한 DML은 감시 기록을 남기기 위해 내부적으로 별도의 트랜잭션에서 커밋됩니다. 따라서 대상 구문을 롤백해도 감시 기록은 남습니다.

## **상수**

본 절에서는 DBMS\_FGA 패키지에서 제공하는 상수를 설명합니다. 모든 상수의 타입은 NUMBER입니다.

<table><thead><tr><th width="180">상수</th><th width="60">값</th><th>설명</th></tr></thead><tbody><tr><td>EXTENDED</td><td>1</td><td>감시 기록에 SQL 구문과 바인드 변수 값을 함께 남기는 비트. 단독으로 지정할 수 없고 DB 또는 XML과 더해서 지정해야 함</td></tr><tr><td>DB</td><td>2</td><td>감시 기록을 SYS.FGA_LOG$ 테이블에 남김</td></tr><tr><td>XML</td><td>4</td><td>감시 기록을 XML 파일로 남김. 현재 미지원 기능</td></tr><tr><td>ANY_COLUMNS</td><td>0</td><td>audit_column에 지정한 컬럼 중 하나라도 참조되면 감시</td></tr><tr><td>ALL_COLUMNS</td><td>1</td><td>audit_column에 지정한 컬럼을 모두 참조할 때만 감시</td></tr></tbody></table>

EXTENDED, DB, XML은 audit\_trail 파라미터에 쓰는 비트 값입니다. 조합할 수 있는 값은 DB, DB와 EXTENDED의 합, XML, XML과 EXTENDED의 합 네 가지뿐이며, 그 밖의 값은 TBR-14308 에러가 발생합니다. ANY\_COLUMNS와 ALL\_COLUMNS는 audit\_column\_opts 파라미터에 쓰며 둘 중 하나만 지정할 수 있습니다.

## **예외**

본 절에서는 DBMS\_FGA 패키지가 선언하는 예외를 설명합니다. 예외 이름으로 잡거나 SQLCODE 값으로 잡을 수 있습니다.

<table><thead><tr><th width="240">예외</th><th width="120">에러 번호</th><th>설명</th></tr></thead><tbody><tr><td>SCHEMA_NOT_FOUND</td><td>TBR-14300</td><td>object_schema에 지정한 스키마가 존재하지 않는 경우</td></tr><tr><td>SCHEMA_NOT_ALLOWED</td><td>TBR-14301</td><td>SYS 스키마의 오브젝트를 대상으로 지정한 경우</td></tr><tr><td>OBJECT_NOT_EXIST</td><td>TBR-14302</td><td>지정한 이름의 테이블 또는 뷰가 해당 스키마에 존재하지 않는 경우</td></tr><tr><td>POLICY_ALREADY_EXIST</td><td>TBR-14303</td><td>같은 오브젝트에 같은 이름의 정책이 이미 존재하는 경우</td></tr><tr><td>POLICY_NOT_EXIST</td><td>TBR-14304</td><td>지정한 이름의 정책이 해당 오브젝트에 존재하지 않는 경우</td></tr><tr><td>INVALID_COLUMN</td><td>TBR-14305</td><td>audit_column에 대상 오브젝트의 컬럼이 아닌 이름이 포함된 경우</td></tr><tr><td>INVALID_HANDLER_MODULE</td><td>TBR-14306</td><td>handler_module의 표기가 잘못된 경우</td></tr><tr><td>INVALID_STATEMENT_TYPES</td><td>TBR-14307</td><td>statement_types에 SELECT, INSERT, UPDATE, DELETE 외의 값이 포함된 경우</td></tr><tr><td>INVALID_AUDIT_TRAIL</td><td>TBR-14308</td><td>audit_trail이 허용된 네 가지 조합 중 하나가 아닌 경우</td></tr><tr><td>INVALID_AUDIT_COLUMN_OPTS</td><td>TBR-14309</td><td>audit_column_opts가 ANY_COLUMNS, ALL_COLUMNS가 아닌 경우</td></tr><tr><td>POLICY_TOO_MANY</td><td>TBR-14310</td><td>하나의 오브젝트에 대한 정책 개수가 256개에 도달한 경우</td></tr><tr><td>ERROR_LICENSE_NOT_SUPPORTED</td><td>TBR-110002</td><td>FGA 기능이 라이선스에서 지원되지 않는 경우</td></tr></tbody></table>

패키지가 선언하지 않은 에러도 발생할 수 있습니다. 이런 에러는 예외 이름 대신 SQLCODE 값으로 처리해야 하며, 각 프러시저의 예외 상황에 함께 정리했습니다. 다만 호출 구문 자체가 프러시저 선언과 맞지 않는 경우에는 PSM 컴파일 단계에서 에러가 발생하므로 예외 처리로 잡을 수 없습니다.

## **프러시저**

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

### **ADD\_POLICY**

FGA 정책을 생성하는 프러시저입니다. 생성된 정책은 딕셔너리에 영속하며, 대상 오브젝트를 참조하는 모든 세션에 영향을 줍니다.

정책을 생성할 때 대상 오브젝트에 배타 락을 걸고 내부적으로 DDL을 수행하므로, 호출 시점에 진행 중이던 트랜잭션은 함께 커밋됩니다.

audit\_condition에 지정한 조건식은 생성 시점에 검증되지 않습니다. 존재하지 않는 컬럼을 참조하는 등 잘못된 조건식으로 정책을 만들면 ADD\_POLICY 자체는 성공하지만 이후 대상 오브젝트를 참조하는 구문이 TBR-8132 에러로 실패합니다. 이 상태는 DROP\_POLICY로 해당 정책을 삭제하면 해소됩니다.

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

* 프로토타입

```
DBMS_FGA.ADD_POLICY
(
    object_schema       IN   VARCHAR2 DEFAULT NULL,
    object_name         IN   VARCHAR2,
    policy_name         IN   VARCHAR2,
    audit_condition     IN   VARCHAR2 DEFAULT NULL,
    audit_column        IN   VARCHAR2 DEFAULT NULL,
    handler_schema      IN   VARCHAR2 DEFAULT NULL,
    handler_module      IN   VARCHAR2 DEFAULT NULL,
    enable              IN   BOOLEAN  DEFAULT TRUE,
    statement_types     IN   VARCHAR2 DEFAULT 'SELECT',
    audit_trail         IN   NUMBER   DEFAULT DB+EXTENDED,
    audit_column_opts   IN   NUMBER   DEFAULT ANY_COLUMNS
);
```

* 파라미터

<table><thead><tr><th width="183">파라미터</th><th>설명</th></tr></thead><tbody><tr><td>object_schema</td><td><ul><li>감시 대상 오브젝트의 스키마 이름</li><li>기본값은 NULL이지만 생략할 수 없음. 생략하거나 NULL을 지정하면 SYS로 접속한 세션에서는 TBR-14301, 그 밖의 세션에서는 TBR-7001 에러가 발생하므로 항상 명시해야 함</li><li>SYS를 지정하면 SCHEMA_NOT_ALLOWED 예외가 발생함</li></ul></td></tr><tr><td>object_name</td><td><ul><li>감시 대상 오브젝트의 이름</li><li>테이블 또는 뷰만 지정할 수 있음</li></ul></td></tr><tr><td>policy_name</td><td><ul><li>생성할 정책 이름</li><li>기본값이 없는 필수 인자. 생략하면 PSM 컴파일 단계에서 TBR-15039 에러가 발생함</li><li>같은 오브젝트 안에서 유일해야 함. 서로 다른 오브젝트에는 같은 이름을 쓸 수 있음</li></ul></td></tr><tr><td>audit_condition</td><td><ul><li>오브젝트 내 감시 대상 데이터의 행 조건을 특정하기 위한 SQL WHERE 절의 조건식</li><li>검색, 삽입, 갱신 또는 삭제되는 행의 값을 사용하여 계산할 수 있는 조건식이어야 함</li><li>SYS_CONTEXT와 같은 함수를 사용할 수 있음</li><li>조건식을 만족하는 행을 참조하면 감시 대상이 됨</li><li>생성 시점에 검증되지 않음. 잘못된 조건식은 이후 대상 오브젝트 조회 시 TBR-8132 에러로 나타남</li></ul><p>(기본값: NULL, NULL은 모든 행이 감시 대상이라는 의미)</p></td></tr><tr><td>audit_column</td><td><ul><li>오브젝트 내 감시 대상 데이터의 열 조건을 특정하기 위한 컬럼 이름의 리스트</li><li>쉼표로 구분하며 대소문자와 앞뒤 공백은 무시됨</li><li>대상 오브젝트의 컬럼이 아닌 이름이 있으면 INVALID_COLUMN 예외가 발생함</li></ul><p>(기본값: NULL, NULL은 참조하는 컬럼에 관계없이 감시한다는 의미)</p></td></tr><tr><td>handler_schema</td><td><ul><li>감시 기록을 남김과 동시에 한 번만 수행할 프러시저의 스키마 이름</li><li>현재 미지원 기능. 지정한 값은 DBA_AUDIT_POLICIES의 PF_SCHEMA에 저장되지만 호출되지 않음</li><li>존재하지 않는 스키마를 지정하면 에러가 발생하지 않고 PF_SCHEMA가 NULL로 남음</li></ul></td></tr><tr><td>handler_module</td><td><ul><li>감시 기록을 남김과 동시에 한 번만 수행할 프러시저의 이름</li><li>패키지 이름을 포함할 수 있음</li><li>현재 미지원 기능. 지정한 값은 DBA_AUDIT_POLICIES의 PF_PACKAGE와 PF_FUNCTION에 저장되지만 호출되지 않음</li><li>마침표가 두 개 이상 포함되면 INVALID_HANDLER_MODULE 예외가 발생함</li></ul></td></tr><tr><td>enable</td><td>생성할 정책의 활성화 여부 (기본값: TRUE)</td></tr><tr><td>statement_types</td><td><p>생성할 정책이 감시할 SQL 구문 타입</p><ul><li>SELECT (기본값)</li><li>INSERT</li><li>UPDATE</li><li>DELETE</li><li>쉼표로 구분하여 여러 개를 지정할 수 있음. 대소문자와 앞뒤 공백은 무시됨</li><li>MERGE 구문은 내부에서 수행된 SQL 구문 타입에 따라 감시 여부가 결정되며, 감시 기록의 STATEMENT_TYPE은 SELECT로 남음</li><li>MERGE를 포함해 그 밖의 값을 지정하면 INVALID_STATEMENT_TYPES 예외가 발생함</li></ul></td></tr><tr><td>audit_trail</td><td><p>감시 기록을 남길 위치와 SQL 구문 및 바인드 변수 기록 여부를 결정</p><ul><li>DBMS_FGA.DB : SQL 구문과 바인드 변수를 제외한 감시 기록을 SYS.FGA_LOG$ 테이블에 남김</li><li>DBMS_FGA.DB + DBMS_FGA.EXTENDED : SQL 구문과 바인드 변수를 포함한 감시 기록을 SYS.FGA_LOG$ 테이블에 남김 (기본값)</li><li>DBMS_FGA.XML : SQL 구문과 바인드 변수를 제외한 감시 기록을 XML 파일로 남김. 현재 미지원 기능</li><li>DBMS_FGA.XML + DBMS_FGA.EXTENDED : SQL 구문과 바인드 변수를 포함한 감시 기록을 XML 파일로 남김. 현재 미지원 기능</li><li>XML 계열을 지정해도 에러는 발생하지 않으며, DBA_AUDIT_POLICIES의 AUDIT_TRAIL에는 지정한 값 그대로 XML 또는 XML+EXTENDED로 표시됨</li><li>XML 계열로 지정한 정책의 감시 기록은 XML 파일이 아니라 SYS.FGA_LOG$ 테이블에 남음. EXTENDED를 함께 지정한 경우에는 SQL 구문과 바인드 변수도 함께 기록됨</li><li>네 가지 조합 외의 값은 INVALID_AUDIT_TRAIL 예외가 발생함</li></ul></td></tr><tr><td>audit_column_opts</td><td><p>SQL 동작이 audit_column 인자에 명시된 모든 컬럼을 참조할 때만 감시 기록을 남길지, 일부만 참조해도 감시 기록을 남길지 결정</p><ul><li>DBMS_FGA.ANY_COLUMNS : audit_column 인자에 명시된 컬럼 중 하나라도 참조할 때 감시 기록을 남김 (기본값)</li><li>DBMS_FGA.ALL_COLUMNS : audit_column 인자에 명시된 모든 컬럼을 참조할 때 감시 기록을 남김</li><li>그 밖의 값은 INVALID_AUDIT_COLUMN_OPTS 예외가 발생함</li></ul></td></tr></tbody></table>

* 예외 상황

<table><thead><tr><th width="240">예외 상황</th><th>설명</th></tr></thead><tbody><tr><td>SCHEMA_NOT_FOUND<br>(TBR-14300)</td><td>object_schema에 지정한 스키마가 존재하지 않는 경우</td></tr><tr><td>SCHEMA_NOT_ALLOWED<br>(TBR-14301)</td><td>object_schema에 SYS를 지정한 경우, 또는 SYS로 접속한 세션에서 object_schema를 생략하거나 NULL로 지정한 경우</td></tr><tr><td>OBJECT_NOT_EXIST<br>(TBR-14302)</td><td>지정한 이름의 테이블 또는 뷰가 없는 경우</td></tr><tr><td>POLICY_ALREADY_EXIST<br>(TBR-14303)</td><td>같은 오브젝트에 같은 이름의 정책이 이미 있는 경우</td></tr><tr><td>INVALID_COLUMN<br>(TBR-14305)</td><td>audit_column에 대상 오브젝트의 컬럼이 아닌 이름이 있는 경우. object_schema를 생략하고 audit_column을 지정한 경우에도 발생함</td></tr><tr><td>INVALID_HANDLER_MODULE<br>(TBR-14306)</td><td>handler_module에 마침표가 두 개 이상 있는 경우</td></tr><tr><td>INVALID_STATEMENT_TYPES<br>(TBR-14307)</td><td>statement_types에 SELECT, INSERT, UPDATE, DELETE 외의 값이 있는 경우</td></tr><tr><td>INVALID_AUDIT_TRAIL<br>(TBR-14308)</td><td>audit_trail이 허용된 네 가지 조합이 아닌 경우. EXTENDED만 단독으로 지정한 경우도 해당함</td></tr><tr><td>INVALID_AUDIT_COLUMN_OPTS<br>(TBR-14309)</td><td>audit_column_opts가 ANY_COLUMNS, ALL_COLUMNS가 아닌 경우</td></tr><tr><td>POLICY_TOO_MANY<br>(TBR-14310)</td><td>대상 오브젝트의 정책 개수가 256개에 도달한 경우</td></tr><tr><td>ERROR_LICENSE_NOT_SUPPORTED<br>(TBR-110002)</td><td>FGA 기능이 라이선스에서 지원되지 않는 경우</td></tr><tr><td>TBR-7001</td><td>SYS 이외의 세션에서 object_schema를 생략하거나 NULL로 지정한 경우</td></tr><tr><td>TBR-15039</td><td>policy_name을 생략한 경우. 런타임 예외가 아니라 PSM 컴파일 단계에서 TBR-15146과 함께 발생하므로 예외 처리로 잡을 수 없음</td></tr></tbody></table>

* 예제

FGA11\_USR 스키마의 FGA11\_EMP 테이블에서 DEPTNO가 20인 행의 SAL 컬럼을 조회하는 SELECT 구문을 감시하는 정책을 만들고, 감시 기록을 확인하는 예제입니다. 정책을 만들 사용자와 대상 테이블을 준비하는 과정부터 정리까지 포함하며, 감시 기록은 계속 누적되므로 현재 세션이 남긴 기록만 조회합니다.

```
CREATE USER FGA11_USR IDENTIFIED BY 'tibero';
GRANT CONNECT, RESOURCE TO FGA11_USR;
GRANT EXECUTE ON SYS.DBMS_FGA TO FGA11_USR;
GRANT SELECT_CATALOG_ROLE TO FGA11_USR;

CONN FGA11_USR/tibero

SET LINESIZE 200
COLUMN DB_USER FORMAT A10
COLUMN OBJECT_NAME FORMAT A11
COLUMN POLICY_NAME FORMAT A13
COLUMN STATEMENT_TYPE FORMAT A14
COLUMN SQL_TEXT FORMAT A30

CREATE TABLE FGA11_EMP (
    EMPNO   NUMBER PRIMARY KEY,
    ENAME   VARCHAR2(20),
    SAL     NUMBER,
    DEPTNO  NUMBER
);

INSERT INTO FGA11_EMP VALUES (1, 'KIM', 1000, 10);
INSERT INTO FGA11_EMP VALUES (2, 'LEE', 2000, 20);
INSERT INTO FGA11_EMP VALUES (3, 'PARK', 3000, 30);
COMMIT;

BEGIN
  DBMS_FGA.ADD_POLICY(
    object_schema     => 'FGA11_USR',
    object_name       => 'FGA11_EMP',
    policy_name       => 'FGA11_SAL_POL',
    audit_condition   => 'DEPTNO = 20',
    audit_column      => 'SAL',
    statement_types   => 'SELECT',
    audit_trail       => DBMS_FGA.DB + DBMS_FGA.EXTENDED,
    audit_column_opts => DBMS_FGA.ANY_COLUMNS);
END;
/

SELECT SAL FROM FGA11_EMP;

SELECT DB_USER, OBJECT_NAME, POLICY_NAME, STATEMENT_TYPE, SQL_TEXT
  FROM DBA_FGA_AUDIT_TRAIL
 WHERE POLICY_NAME = 'FGA11_SAL_POL'
   AND SESSION_ID = SYS_CONTEXT('USERENV', 'SESSIONID');

BEGIN
  DBMS_FGA.DROP_POLICY('FGA11_USR', 'FGA11_EMP', 'FGA11_SAL_POL');
END;
/

CONN SYS/tibero
DROP USER FGA11_USR CASCADE;
```

위 예제의 수행 결과는 다음과 같습니다. SELECT 구문이 세 행을 읽었고 그중 audit\_condition을 만족하는 행이 있으므로 감시 기록이 남지만, 하나의 구문 실행에 대한 기록은 1건입니다.

```
User 'FGA11_USR' created.


Granted.


Granted.


Granted.


Table 'FGA11_EMP' created.


1 row inserted.


1 row inserted.


1 row inserted.


Commit completed.


PSM completed.


       SAL
----------
      1000
      2000
      3000

3 rows selected.


DB_USER    OBJECT_NAME POLICY_NAME   STATEMENT_TYPE SQL_TEXT
---------- ----------- ------------- -------------- ------------------------------
FGA11_USR  FGA11_EMP   FGA11_SAL_POL SELECT         SELECT SAL FROM FGA11_EMP

1 row selected.


PSM completed.


User 'FGA11_USR' dropped.
```

### **DISABLE\_POLICY**

FGA 정책을 비활성화하는 프러시저입니다. 비활성화한 정책은 딕셔너리에 남아 있으나 감시 기록을 남기지 않습니다.

대상 오브젝트에 배타 락을 걸고 정책 상태를 갱신하므로, 호출 시점에 진행 중이던 트랜잭션은 함께 커밋됩니다.

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

* 프로토타입

```
DBMS_FGA.DISABLE_POLICY
(
    object_schema   IN   VARCHAR2 DEFAULT NULL,
    object_name     IN   VARCHAR2,
    policy_name     IN   VARCHAR2
);
```

* 파라미터

<table><thead><tr><th width="191">파라미터</th><th>설명</th></tr></thead><tbody><tr><td>object_schema</td><td><ul><li>감시 대상 오브젝트의 스키마 이름</li><li>기본값은 NULL이지만 생략할 수 없음. 생략하거나 NULL을 지정하면 SYS로 접속한 세션에서는 TBR-14301, 그 밖의 세션에서는 TBR-7001 에러가 발생하므로 항상 명시해야 함</li></ul></td></tr><tr><td>object_name</td><td>감시 대상 오브젝트의 이름</td></tr><tr><td>policy_name</td><td>비활성화할 정책 이름</td></tr></tbody></table>

* 예외 상황

<table><thead><tr><th width="240">예외 상황</th><th>설명</th></tr></thead><tbody><tr><td>SCHEMA_NOT_FOUND<br>(TBR-14300)</td><td>object_schema에 지정한 스키마가 존재하지 않는 경우</td></tr><tr><td>SCHEMA_NOT_ALLOWED<br>(TBR-14301)</td><td>object_schema에 SYS를 지정한 경우, 또는 SYS로 접속한 세션에서 object_schema를 생략하거나 NULL로 지정한 경우</td></tr><tr><td>OBJECT_NOT_EXIST<br>(TBR-14302)</td><td>지정한 이름의 테이블 또는 뷰가 없는 경우</td></tr><tr><td>POLICY_NOT_EXIST<br>(TBR-14304)</td><td>지정한 이름의 정책이 대상 오브젝트에 없는 경우</td></tr><tr><td>TBR-7001</td><td>SYS 이외의 세션에서 object_schema를 생략하거나 NULL로 지정한 경우</td></tr></tbody></table>

* 예제

FGA11\_EMP 테이블에 정책을 만들어 감시 기록 1건을 남긴 뒤 그 정책을 비활성화하고, 감시 대상이던 SELECT 구문을 다시 수행해도 감시 기록이 늘어나지 않는 것을 확인하는 예제입니다.

```
CREATE USER FGA11_USR IDENTIFIED BY 'tibero';
GRANT CONNECT, RESOURCE TO FGA11_USR;
GRANT EXECUTE ON SYS.DBMS_FGA TO FGA11_USR;
GRANT SELECT_CATALOG_ROLE TO FGA11_USR;

CONN FGA11_USR/tibero

SET LINESIZE 200
COLUMN POLICY_NAME FORMAT A13

CREATE TABLE FGA11_EMP (
    EMPNO   NUMBER PRIMARY KEY,
    ENAME   VARCHAR2(20),
    SAL     NUMBER,
    DEPTNO  NUMBER
);

INSERT INTO FGA11_EMP VALUES (1, 'KIM', 1000, 10);
INSERT INTO FGA11_EMP VALUES (2, 'LEE', 2000, 20);
INSERT INTO FGA11_EMP VALUES (3, 'PARK', 3000, 30);
COMMIT;

BEGIN
  DBMS_FGA.ADD_POLICY(
    object_schema   => 'FGA11_USR',
    object_name     => 'FGA11_EMP',
    policy_name     => 'FGA11_SAL_POL',
    audit_condition => 'DEPTNO = 20',
    audit_column    => 'SAL');
END;
/

SELECT SAL FROM FGA11_EMP WHERE DEPTNO = 20;

BEGIN
  DBMS_FGA.DISABLE_POLICY(
    object_schema => 'FGA11_USR',
    object_name   => 'FGA11_EMP',
    policy_name   => 'FGA11_SAL_POL');
END;
/

SELECT POLICY_NAME, ENABLED FROM DBA_AUDIT_POLICIES
 WHERE POLICY_NAME = 'FGA11_SAL_POL';

SELECT SAL FROM FGA11_EMP WHERE DEPTNO = 20;

SELECT COUNT(*) AS AUDIT_CNT FROM DBA_FGA_AUDIT_TRAIL
 WHERE POLICY_NAME = 'FGA11_SAL_POL'
   AND SESSION_ID = SYS_CONTEXT('USERENV', 'SESSIONID');

BEGIN
  DBMS_FGA.DROP_POLICY('FGA11_USR', 'FGA11_EMP', 'FGA11_SAL_POL');
END;
/

CONN SYS/tibero
DROP USER FGA11_USR CASCADE;
```

위 예제의 수행 결과는 다음과 같습니다. DBA\_AUDIT\_POLICIES의 ENABLED가 NO로 바뀌었고, 감시 기록은 비활성화 전에 남은 1건에서 늘어나지 않았습니다.

```
User 'FGA11_USR' created.


Granted.


Granted.


Granted.


Table 'FGA11_EMP' created.


1 row inserted.


1 row inserted.


1 row inserted.


Commit completed.


PSM completed.


       SAL
----------
      2000

1 row selected.


PSM completed.


POLICY_NAME   ENABLED
------------- -------
FGA11_SAL_POL NO

1 row selected.


       SAL
----------
      2000

1 row selected.


 AUDIT_CNT
----------
         1

1 row selected.


PSM completed.


User 'FGA11_USR' dropped.
```

### **DROP\_POLICY**

FGA 정책을 삭제하는 프러시저입니다. 이미 남은 감시 기록은 삭제되지 않습니다.

대상 오브젝트에 배타 락을 걸고 내부적으로 DDL을 수행하므로, 호출 시점에 진행 중이던 트랜잭션은 함께 커밋됩니다.

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

* 프로토타입

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

* 파라미터

<table><thead><tr><th width="182">파라미터</th><th>설명</th></tr></thead><tbody><tr><td>object_schema</td><td><ul><li>감시 대상 오브젝트의 스키마 이름</li><li>기본값은 NULL이지만 생략할 수 없음. 생략하거나 NULL을 지정하면 SYS로 접속한 세션에서는 TBR-14301, 그 밖의 세션에서는 TBR-7001 에러가 발생하므로 항상 명시해야 함</li></ul></td></tr><tr><td>object_name</td><td>감시 대상 오브젝트의 이름</td></tr><tr><td>policy_name</td><td>삭제할 정책 이름</td></tr></tbody></table>

* 예외 상황

<table><thead><tr><th width="240">예외 상황</th><th>설명</th></tr></thead><tbody><tr><td>SCHEMA_NOT_FOUND<br>(TBR-14300)</td><td>object_schema에 지정한 스키마가 존재하지 않는 경우</td></tr><tr><td>SCHEMA_NOT_ALLOWED<br>(TBR-14301)</td><td>object_schema에 SYS를 지정한 경우, 또는 SYS로 접속한 세션에서 object_schema를 생략하거나 NULL로 지정한 경우</td></tr><tr><td>OBJECT_NOT_EXIST<br>(TBR-14302)</td><td>지정한 이름의 테이블 또는 뷰가 없는 경우</td></tr><tr><td>POLICY_NOT_EXIST<br>(TBR-14304)</td><td>지정한 이름의 정책이 대상 오브젝트에 없는 경우</td></tr><tr><td>TBR-7001</td><td>SYS 이외의 세션에서 object_schema를 생략하거나 NULL로 지정한 경우</td></tr></tbody></table>

* 예제

FGA11\_SAL\_POL 정책을 삭제해 DBA\_AUDIT\_POLICIES에서 사라지는 것을 확인하고, 대상 테이블과 사용자까지 정리하는 예제입니다.

```
CREATE USER FGA11_USR IDENTIFIED BY 'tibero';
GRANT CONNECT, RESOURCE TO FGA11_USR;
GRANT EXECUTE ON SYS.DBMS_FGA TO FGA11_USR;
GRANT SELECT_CATALOG_ROLE TO FGA11_USR;

CONN FGA11_USR/tibero

CREATE TABLE FGA11_EMP (
    EMPNO   NUMBER PRIMARY KEY,
    ENAME   VARCHAR2(20),
    SAL     NUMBER,
    DEPTNO  NUMBER
);

INSERT INTO FGA11_EMP VALUES (1, 'KIM', 1000, 10);
INSERT INTO FGA11_EMP VALUES (2, 'LEE', 2000, 20);
INSERT INTO FGA11_EMP VALUES (3, 'PARK', 3000, 30);
COMMIT;

BEGIN
  DBMS_FGA.ADD_POLICY(
    object_schema   => 'FGA11_USR',
    object_name     => 'FGA11_EMP',
    policy_name     => 'FGA11_SAL_POL',
    audit_condition => 'DEPTNO = 20',
    audit_column    => 'SAL');
END;
/

SELECT COUNT(*) AS POLICY_CNT FROM DBA_AUDIT_POLICIES
 WHERE POLICY_NAME = 'FGA11_SAL_POL';

BEGIN
  DBMS_FGA.DROP_POLICY(
    object_schema => 'FGA11_USR',
    object_name   => 'FGA11_EMP',
    policy_name   => 'FGA11_SAL_POL');
END;
/

SELECT COUNT(*) AS POLICY_CNT FROM DBA_AUDIT_POLICIES
 WHERE POLICY_NAME = 'FGA11_SAL_POL';

DROP TABLE FGA11_EMP;

CONN SYS/tibero
DROP USER FGA11_USR CASCADE;
```

위 예제의 수행 결과는 다음과 같습니다. 삭제 전 1건이던 정책이 삭제 후에는 조회되지 않습니다.

```
User 'FGA11_USR' created.


Granted.


Granted.


Granted.


Table 'FGA11_EMP' created.


1 row inserted.


1 row inserted.


1 row inserted.


Commit completed.


PSM completed.


POLICY_CNT
----------
         1

1 row selected.


PSM completed.


POLICY_CNT
----------
         0

1 row selected.


Table 'FGA11_EMP' dropped.


User 'FGA11_USR' dropped.
```

### **ENABLE\_POLICY**

FGA 정책을 활성화하는 프러시저입니다. enable에 FALSE를 지정하면 DISABLE\_POLICY와 같이 동작합니다.

대상 오브젝트에 배타 락을 걸고 정책 상태를 갱신하므로, 호출 시점에 진행 중이던 트랜잭션은 함께 커밋됩니다.

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

* 프로토타입

```
DBMS_FGA.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="175">파라미터</th><th>설명</th></tr></thead><tbody><tr><td>object_schema</td><td><ul><li>감시 대상 오브젝트의 스키마 이름</li><li>기본값은 NULL이지만 생략할 수 없음. 생략하거나 NULL을 지정하면 SYS로 접속한 세션에서는 TBR-14301, 그 밖의 세션에서는 TBR-7001 에러가 발생하므로 항상 명시해야 함</li></ul></td></tr><tr><td>object_name</td><td>감시 대상 오브젝트의 이름</td></tr><tr><td>policy_name</td><td>활성화할 정책 이름</td></tr><tr><td>enable</td><td><ul><li>정책의 활성화 여부 (기본값: TRUE)</li><li>FALSE를 지정하면 정책을 비활성화함</li></ul></td></tr></tbody></table>

* 예외 상황

<table><thead><tr><th width="240">예외 상황</th><th>설명</th></tr></thead><tbody><tr><td>SCHEMA_NOT_FOUND<br>(TBR-14300)</td><td>object_schema에 지정한 스키마가 존재하지 않는 경우</td></tr><tr><td>SCHEMA_NOT_ALLOWED<br>(TBR-14301)</td><td>object_schema에 SYS를 지정한 경우, 또는 SYS로 접속한 세션에서 object_schema를 생략하거나 NULL로 지정한 경우</td></tr><tr><td>OBJECT_NOT_EXIST<br>(TBR-14302)</td><td>지정한 이름의 테이블 또는 뷰가 없는 경우</td></tr><tr><td>POLICY_NOT_EXIST<br>(TBR-14304)</td><td>지정한 이름의 정책이 대상 오브젝트에 없는 경우</td></tr><tr><td>TBR-7001</td><td>SYS 이외의 세션에서 object_schema를 생략하거나 NULL로 지정한 경우</td></tr></tbody></table>

* 예제

정책을 만든 뒤 곧바로 비활성화해 두고, 그 정책을 다시 활성화한 다음 감시 기록이 늘어나는 것을 확인하는 예제입니다.

```
CREATE USER FGA11_USR IDENTIFIED BY 'tibero';
GRANT CONNECT, RESOURCE TO FGA11_USR;
GRANT EXECUTE ON SYS.DBMS_FGA TO FGA11_USR;
GRANT SELECT_CATALOG_ROLE TO FGA11_USR;

CONN FGA11_USR/tibero

SET LINESIZE 200
COLUMN POLICY_NAME FORMAT A13

CREATE TABLE FGA11_EMP (
    EMPNO   NUMBER PRIMARY KEY,
    ENAME   VARCHAR2(20),
    SAL     NUMBER,
    DEPTNO  NUMBER
);

INSERT INTO FGA11_EMP VALUES (1, 'KIM', 1000, 10);
INSERT INTO FGA11_EMP VALUES (2, 'LEE', 2000, 20);
INSERT INTO FGA11_EMP VALUES (3, 'PARK', 3000, 30);
COMMIT;

BEGIN
  DBMS_FGA.ADD_POLICY(
    object_schema   => 'FGA11_USR',
    object_name     => 'FGA11_EMP',
    policy_name     => 'FGA11_SAL_POL',
    audit_condition => 'DEPTNO = 20',
    audit_column    => 'SAL');
  DBMS_FGA.DISABLE_POLICY(
    object_schema => 'FGA11_USR',
    object_name   => 'FGA11_EMP',
    policy_name   => 'FGA11_SAL_POL');
END;
/

SELECT SAL FROM FGA11_EMP WHERE DEPTNO = 20;

SELECT COUNT(*) AS AUDIT_CNT FROM DBA_FGA_AUDIT_TRAIL
 WHERE POLICY_NAME = 'FGA11_SAL_POL'
   AND SESSION_ID = SYS_CONTEXT('USERENV', 'SESSIONID');

BEGIN
  DBMS_FGA.ENABLE_POLICY(
    object_schema => 'FGA11_USR',
    object_name   => 'FGA11_EMP',
    policy_name   => 'FGA11_SAL_POL',
    enable        => TRUE);
END;
/

SELECT POLICY_NAME, ENABLED FROM DBA_AUDIT_POLICIES
 WHERE POLICY_NAME = 'FGA11_SAL_POL';

SELECT SAL FROM FGA11_EMP WHERE DEPTNO = 20;

SELECT COUNT(*) AS AUDIT_CNT FROM DBA_FGA_AUDIT_TRAIL
 WHERE POLICY_NAME = 'FGA11_SAL_POL'
   AND SESSION_ID = SYS_CONTEXT('USERENV', 'SESSIONID');

BEGIN
  DBMS_FGA.DROP_POLICY('FGA11_USR', 'FGA11_EMP', 'FGA11_SAL_POL');
END;
/

CONN SYS/tibero
DROP USER FGA11_USR CASCADE;
```

위 예제의 수행 결과는 다음과 같습니다. 비활성 상태에서는 감시 기록이 남지 않았고, 활성화한 뒤에 수행한 같은 구문에서 1건이 남았습니다.

```
User 'FGA11_USR' created.


Granted.


Granted.


Granted.


Table 'FGA11_EMP' created.


1 row inserted.


1 row inserted.


1 row inserted.


Commit completed.


PSM completed.


       SAL
----------
      2000

1 row selected.


 AUDIT_CNT
----------
         0

1 row selected.


PSM completed.


POLICY_NAME   ENABLED
------------- -------
FGA11_SAL_POL YES

1 row selected.


       SAL
----------
      2000

1 row selected.


 AUDIT_CNT
----------
         1

1 row selected.


PSM completed.


User 'FGA11_USR' dropped.
```


---

# 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_fga.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.
