안녕하세요, Surmin입니다.
오늘은 Audit에 대해 이야기 나누고자 합니다.
참고 부탁드립니다.
Audit란
- 사용자의 행동을 감시하거나 데이터베이스에 관한 통계자료를 얻는 목적으로 사용 합니다.
- 권한을 받은 사용자가 허가 되지 않은 데이터를 마음대로 변경하는 것을 막기 위하여 사용자가 데이터를 조회, 조작할 때마다 이에대한 정보를 기록하여, 언제 누가 무엇을 하였는지 확인 가능하다.
Database Audit 개요
데이터베이스에 영향을 끼치는 작업을 감시하거나 특정 데이터베이스 작업에 대한 모니터하고 수집한다. ⇒ Audit Trail에 저장됨
- DB의 모든 연결에 대해 감사가 가능하다.
- 특정 DB 작업을 모니터링하고, 그에 대한 데이터를 모으는 데 사용될 수 있다. ex(갱신중인 테이블, 수행한 논리적 I/O횟수, 시스템이 바쁜 시간에 연결한 동시 User 수에 대한 통계를 수집할 수 있다.)
- 컬럼의 값에 대한 기록은 불가능하다. [이전 값: salary = 45000 ⇐ 기록 안됨 변경 값: salary = 50000 ⇐ 기록 안됨]
Setting Audit Parameter
- Init 파라메터 중 AUDIT_TRAIL을 이용하여 활성/비활성 설정 가능함

SQLBIND와 SQLTEXT란?
– SQLTEXT: 감사 작업을 발생시킨 실제 SQL 문장이 기록됩니다.
– SQLBIND: SQL 문에서 사용된 바인드 변수의 값들이 기록됩니다.
일반 DB vs DB_EXTENDED의 차이
- AUDIT_TRAIL=DB: 기본적인 감사 정보만 SYS.AUD$ 테이블에 저장 AUDIT_TRAIL
- AUDIT_TRAIL=DB_EXTENDED: DB와 동일한 모든 작업을 수행하면서 추가로 SYS.AUD$ 테이블의 SQLBIND와 SQLTEXT CLOB 컬럼도 채워줍니다
Specify Audit Options
Audit 할 명령, user, object, privilege를 지정한다.
Audit Record 가 발생할 때마다 생성할 지, Session 당 한번 생성할 지를 결정할 수 있다.
- Statement Auditing – SQL 명령문의 유형에 따른 Auditing 설정
- ex) AUDIT TABLE BY SCOTT BY ACCESS WHENEVER SUCCESSFUL;
- scott 유저가 테이블에 관련된 명령(create table, drop table 등)이 성공한 경우 기록된다.
- ex) AUDIT TABLE BY SCOTT BY ACCESS WHENEVER SUCCESSFUL;
- Privilege Auditing – 사용되는 PRIVILEGE에 따른 Auditing 설정
- ex) AUDIT CREATE TABLE BY SCOTT BY SESSION;
- scott 유저가 ‘create table’ 권한이 필요한 명령을 수행시 기록
- ex) AUDIT CREATE TABLE BY SCOTT BY SESSION;
- Object Auditing – 특정 스키마의 개체의 명령문에 대한 Auditing 설정
- ex) AUDIT ALL ON SCOTT.EMP;
- scott.emp 테이블에 대한 모든 명령(select, insert, update, delete, drop등)에 관한 사항이 기록된다.
- ex) AUDIT ALL ON SCOTT.EMP;
⇒ 설정된 AUDIT 기능은 NOAUDIT 명령으로 제거할 수 있다.
ex) NOAUDIT ALL ON SCOTT.EMP;
Execute Command
- 사용자가 SQL 또는 PL/SQL 문을 실행할 때 Server Process는 Audit 옵션을 검색하여 실행중인 Statement가 감사 대상에 포함되는지 여부를 먼저 결정한다.
Generate Audit Trail
- audit_trail 파라미터에 정의된 값에 따라 OS 의 파일 또는 데이터베이스 내에 SYS.AUD$에 Audit Trail 레코드를 생성한다. 이 작업은 사용자의 Transaction 과 무관하므로 Transaction Rollback 이 수행될 지라도 Audit Trail 레코드는 그대로 유지된다. 단, Audit Trail 레코드는 구문의 execute 단계에서 생성되므로 Parsing 단계에서 오류가 발생하면 생성되지 않는다.
Review Audit Information
- Audit 을 통해 생성된 정보는 아래의 Audit Trail Data Dictionary 뷰를 통해 확인할 수 있다. OS 에 생성된 Audit Trail 인 경우 OS Utility 를 사용하여 확인한다. 이 정보를 토대로 의심이 가는 작업을 확인하거나 데이터베이스 작업에 대한 모니터링을 수 있다.

ex) 1(AUDIT_TRAIL=DB)
SET LINESIZE 100
show parameter audit_trail
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
audit_trail string DB #SYS.AUD$에 저장
SQL> audit select on scott.emp by session whenever successful;
Audit succeeded.
SQL> AUDIT SELECT ON HR.EMPLOYEES BY SESSION;
OWNER OBJECT_NAME OBJECT_TYPE SEL
---------- --------------- --------------- ----------
HR EMPLOYEES TABLE S/S
select * from dba_obj_audit_opts
where object_name = 'EMPLOYEES' and owner = 'HR';

dba_obj_audit_opts는 각 테이블/객체에 설정된 감시 옵션을 보여줍니다.
표시 형식: A/S
- 앞자리: 성공한 경우 어떻게 기록할지
- 뒷자리: 실패한 경우 어떻게 기록할지
기록 방식
- A (Access): 명령어 실행할 때마다 기록
- S (Session): 세션당 한 번만 기록
- (하이픈): 기록 안함
예시로 이해하기
S/S
(SELECT 컬럼)
- 성공한 SELECT → 세션당 1번 기록
- 실패한 SELECT → 세션당 1번 기록
A/-
- 성공 시 → 매번 기록
- 실패 시 → 기록 안함
-/-
- 성공/실패 둘 다 기록 안함
SQL> select count(*) from sys.aud$;
COUNT(*)
----------
0
#한번 명령어 틀린 후 두번째 입력하는거임
SQL> select * from employees where salary > 3000;
SQL> conn / as sysdba
Connected.
SQL> select count(*) from sys.aud$;
COUNT(*)
----------
2
select os_username, username, timestamp, owner, obj_name, action_name, ses_actions, returncode from dba_audit_object;

- returncode가 0인 경우는 SUCCESS 임을 의미한다.
- by session로 설정한 경우 audit를 설정한 경우 action_name 은 ‘SESSION REC’으로 표시된다.
- ses_actions columns은 총 13가지의 action(alter, audit, comment, delete, grant, index, insert, lock, rename, select, update, reference, execute)에 대한 Audit 정보를 포함한다. 각 Action에 대해 모두 성공하였다면 ‘S’를 실패하였다면 ‘F’로 표현되며 성공과 실패가 모두 있었다면 ‘B’로 표현된다.
- by access로 설정한 경우 action_name 컬럼에 해당 action(예: delete, insert)등이 바로 기술된다.
#ORA-00904: invalid identifier – 잘못된 식별자(컬럼명) 에러
#Private Audit 설정
#sys계정 접속
-- 시스템 권한들 감사 설정
#누군가 Rule 생성 시도할 때
AUDIT CREATE ANY RULE BY ACCESS;
#누군가 기존 Rule 수정 시도할 때
AUDIT ALTER ANY RULE BY ACCESS;
#누군가 Rule 실행 시도할 때
AUDIT EXECUTE ANY RULE BY ACCESS;
#확인
select * from dba_priv_audit_opts;

#HR 사용자가 데이터베이스에 접속(로그인)할 때만 감사 기록을 남긴다.
SQL> audit create session by hr;
#확인
select * from dba_priv_audit_opts;

-- connect session
SQL> conn hr/hr
SQL> disconnect
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> ! date
Sat Jun 7 00:26:27 KST 2025
SQL> connect /as sysdba
SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
select os_username, username, timestamp, action_name, logoff_time, logoff_lread, logoff_pread
from dba_audit_session
where username = 'HR';

1번째 레코드 (LOGON)
- ACTION_NAME: LOGON (로그인)
- LOGOFF_TIME: (null) → 아직 로그아웃 안함
- LOGOFF_LREAD: (null) → 로그아웃 시 읽은 블록 수 (아직 없음)
- LOGOFF_PREAD: (null) → 로그아웃 시 물리적 읽은 블록 수 (아직 없음)
2번째 레코드 (LOGOFF)
- ACTION_NAME: LOGOFF (로그아웃)
- LOGOFF_TIME: 25/06/07 → 로그아웃 완료
- LOGOFF_LREAD: 415 → 세션 동안 논리적으로 읽은 블록 수
- LOGOFF_PREAD: 0 → 세션 동안 물리적으로 읽은 블록 수
-- 다른 쪽 터미널에서 HR 유저로 접속하고 다시 조회하면,
select os_username, username, timestamp, action_name, logoff_time, logoff_lread, logoff_pread
from dba_audit_session
where username = 'HR';

-- 존재하지 않는 객체에 대한 접근 시도를 감사 설정
audit not exists by hr;
#확인
select * from dba_stmt_audit_opts ;

conn hr/hr
SQL> grant select on not_exist_table to tester;
grant select on not_exist_table to tester
*
ERROR at line 1:
ORA-00942: table or view does not exist
select os_username,username,timestamp,obj_name,action_name,
obj_privilege, grantee from dba_audit_statement;

기본 정보
- OS_USERNAME: oracle (운영체제 사용자)
- USERNAME: HR (데이터베이스 사용자)
- TIMESTAMP: 25/06/07 (2025년 6월 7일)
감사 이벤트 분석
OBJ_NAME: NOT_EXIST_TABLE
- HR 사용자가 존재하지 않는 테이블에 접근 시도
ACTION_NAME: GRANT OBJECT
- GRANT 명령어를 실행했음
- 객체에 대한 권한 부여 시도
OBJ_PRIVILEGE: (빈 값)
- 권한 부여가 실패했음을 의미
GRANTEE: TESTER
- TESTER 사용자에게 권한을 주려고 했음
=>위의 결과에서는 어떤 구문을 실행했을 때 Auditing 되었는지 정확히 알 수가 없고, Object Audit 에서 볼 수 있듯이 어떤 데이터를 조회했는지 알 수가 없다.
ex 2(AUDIT_TRAIL=DB_EXTENDED, Oracle Database 10g New Feature)
SQL> show parameter audit_trail
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
audit_trail string DB
#변경
ALTER SYSTEM SET audit_trail=DB,EXTENDED SCOPE=SPFILE;
#적용을 위하여 재시작 필요
SQL> shut immediate;
SQL> startup
#적용 확인
#19c에서는 DB_EXTENDED 부분이 DB, EXTENDED 표시됨
SQL> SHOW PARAMETER audit_trail;
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
audit_trail string DB, EXTENDED
#HR.EMPLOYEES 테이블에 대한 모든 INSERT 작업을 감사하며, 각 INSERT마다 별도의 감사 레코드를 생성한다.
SQL> AUDIT INSERT ON HR.EMPLOYEES BY ACCESS;
#확인
SQL> select owner, object_type, object_name, ins from dba_obj_audit_opts
where owner='HR' and object_name='EMPLOYEES';
SET LINESIZE 120;
SET PAGESIZE 50;
COL OWNER FORMAT A15;
COL OBJECT_TYPE FORMAT A15;
COL OBJECT_NAME FORMAT A20;
COL INS FORMAT A5;
OWNER OBJECT_TYPE OBJECT_NAME INS
--------------- --------------- -------------------- -----
HR TABLE EMPLOYEES A/A
감사 설정 상태
- OWNER: HR
- OBJECT_TYPE: TABLE
- OBJECT_NAME: EMPLOYEES
- INS: A/A
INS 컬럼 의미 (A/A)
A/A = “Always/Always”
- 첫 번째 A: 성공한 INSERT 감사 (Always)
- 두 번째 A: 실패한 INSERT 감사 (Always)
- A/A: 성공/실패 모두 감사
SQL> desc dba_audit_object
Name Null? Type
----------------------------------------------------------------- -------- --------------------------------------------
OS_USERNAME VARCHAR2(255)
USERNAME VARCHAR2(128)
USERHOST VARCHAR2(128)
TERMINAL VARCHAR2(255) #client pc명: 사용자를 짐작할 수 있음
TIMESTAMP DATE
OWNER VARCHAR2(128)
OBJ_NAME VARCHAR2(128)
ACTION_NAME VARCHAR2(28)
NEW_OWNER VARCHAR2(128)
NEW_NAME VARCHAR2(128)
SES_ACTIONS VARCHAR2(19)
COMMENT_TEXT VARCHAR2(4000)
SESSIONID NOT NULL NUMBER
ENTRYID NOT NULL NUMBER
STATEMENTID NOT NULL NUMBER
RETURNCODE NOT NULL NUMBER
PRIV_USED VARCHAR2(40)
CLIENT_ID VARCHAR2(128)
ECONTEXT_ID VARCHAR2(64)
SESSION_CPU NUMBER
EXTENDED_TIMESTAMP TIMESTAMP(6) WITH TIME ZONE
PROXY_SESSIONID NUMBER
GLOBAL_UID VARCHAR2(32)
INSTANCE_NUMBER NUMBER
OS_PROCESS VARCHAR2(16)
TRANSACTIONID RAW(8)
SCN NUMBER
SQL_BIND NVARCHAR2(2000)
SQL_TEXT NVARCHAR2(2000)
OBJ_EDITION_NAME VARCHAR2(128)
##ORACLE DATABASE 10G 에서 AUD$ 테이블에는 위 DBA 뷰에서 보듯이 SQL_BIND 와 SQL_TEST 두 컬럼이 추가되었다.
SET LINESIZE 200;
SET PAGESIZE 50;
COL USERNAME FORMAT A12;
COL OWNER FORMAT A8;
COL OBJ_NAME FORMAT A12;
COL ACTION_NAME FORMAT A12;
COL SES_ACTIONS FORMAT A15;
COL RETURNCODE FORMAT 999999;
COL TIMESTAMP FORMAT A12;
COL SQL_BIND FORMAT A20;
COL SQL_TEXT FORMAT A30;
SQL> SELECT username,owner,obj_name,action_name,ses_actions,returncode, timestamp,sql_bind,sql_text from dba_audit_object;
USERNAME OWNER OBJ_NAME ACTION_NAME SES_ACTIONS RETURNCODE TIMESTAMP SQL_BIND SQL_TEXT
------------ -------- ------------ ------------ --------------- ---------- ------------ -------------------- ------------------------------
HR HR EMPLOYEES SESSION REC ---------F----- 904 06-JUN-25
-
HR HR EMPLOYEES SESSION REC ---------S----- 0 06-JUN-25
#변수선언
variable empno number; -- 숫자형 바인드 변수
variable ename varchar2(8); -- 문자형 바인드 변수 (최대 8자)
begin
:empno := 9999; -- empno에 숫자 9999 할당
:ename := 'TESTER'; -- empno에 문자 'TESTER' 할당
end;
/
#insert 실행
INSERT INTO EMPLOYEES
(EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, HIRE_DATE, JOB_ID, SALARY, MANAGER_ID, DEPARTMENT_ID)
VALUES
(:empno, 'TEST', :ename, 'TESTER@TEST.COM', SYSDATE, 'IT_PROG', 3000, 100, 20);
commit;
#관리자 접속
SQL> conn / as sysdba
#객체별 감사 로그를 조회
select username,owner,obj_name,action_name,ses_actions,returncode,timestamp,
sql_bind, sql_text
from dba_audit_object;
USERNAME OWNER OBJ_NAME ACTION_NAME SES_ACTIONS RETURNCODE TIMESTAMP SQL_BIND SQL_TEXT
------------ -------- ------------ ------------ --------------- ---------- ------------ -------------------- ------------------------------
HR HR EMPLOYEES INSERT 947 08-JUN-25 insert into EMPLOYEES values (
:empno, :ename, 'MANAGER',7499
,SYSDATE,3000,'',20)
HR HR EMPLOYEES INSERT 2291 08-JUN-25 #1(4):9999 #2(6):TE INSERT INTO EMPLOYEES
STER (EMPLOYEE_ID, FIRST_NAME, LAST
_NAME, EMAIL, HIRE_DATE, JOB_I
D, SALARY, MANAGER_ID, DEPARTM
ENT_ID)
VALUES
(:empno, 'TEST', :ename, 'TEST
ER@TEST.COM', SYSDATE, 'IT_PRO
G', 3000, 7499, 20)
HR HR EMPLOYEES INSERT 0 08-JUN-25 #1(4):9999 #2(6):TE INSERT INTO EMPLOYEES
STER (EMPLOYEE_ID, FIRST_NAME, LAST
_NAME, EMAIL, HIRE_DATE, JOB_I
D, SALARY, MANAGER_ID, DEPARTM
ENT_ID)
VALUES
(:empno, 'TEST', :ename, 'TEST
ER@TEST.COM', SYSDATE, 'IT_PRO
G', 3000, 100, 20)
HR HR EMPLOYEES SESSION REC ---------F----- 904 06-JUN-25
-
HR HR EMPLOYEES SESSION REC ---------S----- 0 06-JUN-25
-
**감사 로그 상세 해석:**
## 시간순 작업 분석
### 1. 6월 6일 (과거 기록)
```
SESSION REC ---------F----- 904 (INSERT 실패)
SESSION REC ---------S----- 0 (INSERT 성공)
```
### 2. 6월 8일 (최근 작업) - 3번의 INSERT 시도
#### 첫 번째 INSERT (실패 - 947 에러)
```sql
insert into EMPLOYEES values (:empno, :ename, 'MANAGER',7499,SYSDATE,3000,'',20)
```
- **RETURNCODE 947**: ORA-00947 (컬럼 수 부족)
- **SQL_BIND**: 없음 (바인드 변수 값 기록 안됨)
#### 두 번째 INSERT (실패 - 2291 에러)
```sql
INSERT INTO EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, HIRE_DATE, JOB_ID, SALARY, MANAGER_ID, DEPARTMENT_ID)
VALUES (:empno, 'TEST', :ename, 'TESTER@TEST.COM', SYSDATE, 'IT_PROG', 3000, 7499, 20)
```
- **RETURNCODE 2291**: 외래키 제약조건 위반 (MANAGER_ID 7499 없음)
- **SQL_BIND**: `#1(4):9999 #2(6):TESTER`
- empno = 9999
- ename = 'TESTER'
#### 세 번째 INSERT (성공 - 0)
```sql
같은 SQL이지만 MANAGER_ID를 100으로 변경
```
- **RETURNCODE 0**: 성공
- **SQL_BIND**: 동일한 바인드 변수 값
## 바인드 변수 해석
- **#1(4):9999**: 첫 번째 바인드 변수, 길이 4, 값 9999
- **#2(6):TESTER**: 두 번째 바인드 변수, 길이 6, 값 'TESTER'
**요약**: HR 사용자가 직원 추가를 3번 시도했고, 첫 2번은 실패, 마지막에 성공한 전체 과정이 기록되었습니다.
Controlling the Growth and Size of the Standard Audit
- Audit Trail 이 쌓이는 SYS.AUD$ 테이블은 SYSTEM 테이블스페이스 생성된다.
- SYS.AUD$ 데이터가 쌓임으로써 SYSTEM 테이블에 대하여 경합 등 부담을 줄 수 있다.
- EX) CREATE SESSION 에 대한 AUDITING을 수행할 때 세션의 사용량에 따라 엄청난 데이터가 축적될 수 있다. 그러므로 불필요한 Audit 기능은 제한하고, Audit 하는 기간동안 SYS.AUD$ 테이블의 크기를 적절히 유지하도록 해야한다.
#감사 레코드 삭제/정리
1.Purging Audit Record from the Audit Trail
#감사 정보 아카이빙 2. Archiving Audit Trail Information
#감사 로그 크기 줄이기 3.Reducing the Size of the Audit Trail
-- Purging Audit Record from the Audit Trail
#모든 감사 레코드 삭제
#SYS.AUD$ 테이블의 전체 감사 로그 삭제 모든 사용자, 모든 객체, 모든 시점의 감사 기록 제거
DELETE FROM SYS.AUD$;
#특정 객체 감사 레코드만 삭제
#EMP 테이블과 관련된 감사 로그만 삭제, 다른 객체들의 감사 기록은 유지
DELETE FROM SYS.AUD$ WHERE obj$name = 'EMP';
#감사 테이블 완전 초기화
#모든 감사 레코드를 즉시 완전 삭제 (롤백 불가능)
TRUNCATE TABLE SYS.AUD$;
##용량 확인
#객체별 감사 레코드 수와 용량
SELECT obj$name as object_name,
COUNT(*) as record_count,
ROUND(COUNT(*) * 200 / 1024, 2) as size_kb -- 대략적 크기
FROM sys.aud$
WHERE obj$name IS NOT NULL
GROUP BY obj$name
ORDER BY COUNT(*) DESC;
OBJECT_NAME RECORD_COUNT SIZE_KB
-------------------- ------------ ----------
EMPLOYEES 5 .98
NOT_EXIST_TABLE 1 .2 #NOT_EXIST_TABLE은 존재하지 않는 테이블에 대한 접근 시도를 의미합니다.
##AUD$ 총 용량 확인 (초기 볼륨은 64kb 할당함)
SELECT
segment_name,
ROUND(bytes / 1024, 2) AS size_kb
FROM
dba_segments
WHERE
segment_name = 'AUD$';
SEGMENT_NAME SIZE_KB
------------- -------
AUD$ 64
-- Archiving Audit Trail Information
#먼저 백업 테이블 생성
CREATE TABLE audit_backup_table AS
SELECT * FROM sys.aud$ WHERE 1=0;
#조건없이 전체 백업 (디폴트 TBS 쌓이는데 system임)
INSERT INTO audit_backup_table
SELECT * FROM sys.aud$;
#지정 TBS
CREATE TABLE audit_backup_table
TABLESPACE USERS -- 원하는 테이블스페이스 지정
AS SELECT * FROM sys.aud$ WHERE 1=0;
#백업(30일치 혹은 timestamp가 null값인 경우만)
INSERT INTO audit_backup_table
SELECT * FROM sys.aud$
WHERE timestamp# IS NULL
OR timestamp# >= SYSDATE - 30;
--exp방법
--"SYS 객체들은 Data Pump Export로 백업되지 않습니다 (SYS.AUD$ 포함)"
exp system/oracle file=aud.dmp tables="sys.aud$"
-- Reducing the Size of the Audit Trail
1. SYS.AUD$ 에 대한 백업을 수행한다. - Export 등
2. sys 유저로 접속한다. – 관리자에 의한 수행
3. TRUNCATE TABLE SYS.AUD$; (HWM 의 이동으로 extent할당을 해제하여 테이블 내 공간을 줄임.)
4. Audit Trail Record가 많이 생성되면 1번부터 재수행한다.
설정 OS로 하였을 경우
-OS로 하여도 DQL,DCL,DDL 문 뭐를 실행 했는지 나온다. (뷰,프로시저포함)
#설정확인
SQL> SHOW PARAMETER audit_trail;
#로그 위치확인
SQL>SHOW PARAMETER audit_file_dest;
[oracle@ORA19C adump]$ strings ORA19C_ora_45648_20250608221903518645929291.aud
Audit file /app/oracle/admin/ORA19C/adump/ORA19C_ora_45648_20250608221903518645929291.aud
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
Build label: RDBMS_19.3.0.0.0DBRU_LINUX.X64_190417
ORACLE_HOME: /app/oracle/product/19c
System name: Linux
Node name: ORA19C
Release: 5.15.0-101.103.2.1.el8uek.x86_64
Version: #2 SMP Mon May 1 20:11:30 PDT 2023
Machine: x86_64
Instance name: ORA19C
Redo thread mounted by this instance: 1
Oracle process number: 34
Unix process pid: 45648, image: oracle@ORA19C (TNS V1-V3)
Sun Jun 8 22:19:03 2025 +09:00
LENGTH: "313"
SESSIONID:[6] "220005" ENTRYID:[1] "1" STATEMENT:[1] "1" USERID:[2] "HR" USERHOST:[6] "ORA19C" TERMINAL:[5] "pts/1" ACTION:[3] "100" RETURNCODE:[1] "0" COMMENT$TEXT:[53] "Authenticated by: DATABASE;AUTHENTICATED IDENTITY: HR" OS$USERID:[6] "oracle" DBID:[10] "1250081923" PRIV$USED:[1] "5" CURRENT_USER:[2] "HR"
Sun Jun 8 22:19:07 2025 +09:00
LENGTH: "323"
SESSIONID:[6] "220005" ENTRYID:[1] "2" STATEMENT:[1] "7" USERID:[2] "HR" USERHOST:[6] "ORA19C" TERMINAL:[5] "pts/1" ACTION:[3] "103" RETURNCODE:[1] "0" OBJ$CREATOR:[2] "HR" OBJ$NAME:[9] "EMPLOYEES" SES$ACTIONS:[16] "---------S------" SES$TID:[5] "72977" OS$USERID:[6] "oracle" DBID:[10] "1250081923" CURRENT_USER:[2] "HR"
Sun Jun 8 22:19:12 2025 +09:00
LENGTH: "265"
SESSIONID:[6] "220005" ENTRYID:[1] "3" STATEMENT:[1] "8" USERID:[2] "HR" USERHOST:[6] "ORA19C" TERMINAL:[5] "pts/1" ACTION:[1] "2" RETURNCODE:[1] "0" OBJ$CREATOR:[2] "HR" OBJ$NAME:[9] "EMPLOYEES" OS$USERID:[6] "oracle" DBID:[10] "1250081923" CURRENT_USER:[2] "HR"
Sun Jun 8 22:19:15 2025 +09:00
LENGTH: "222"
SESSIONID:[6] "220005" ENTRYID:[1] "1" USERID:[2] "HR" ACTION:[3] "101" RETURNCODE:[1] "0" LOGOFF$PREAD:[2] "12" LOGOFF$LREAD:[3] "486" LOGOFF$LWRITE:[2] "16" LOGOFF$DEAD:[1] "0" DBID:[10] "1250081923" SESSIONCPU:[1] "2"
ACTION 코드 100, 2의 의미는 다음과 같습니다:
ACTION 코드 해석
ACTION: 100 = LOGON (로그인)
ACTION:[3] "100"
COMMENT$TEXT: "Authenticated by: DATABASE;AUTHENTICATED IDENTITY: HR"
- 사용자가 데이터베이스에 로그인하는 작업
- 인증 방식과 사용자 식별 정보도 함께 기록
ACTION: 2 = INSERT (삽입)
ACTION:[1] "2"
OBJ$CREATOR: "HR"
OBJ$NAME: "EMPLOYEES"
- HR.EMPLOYEES 테이블에 데이터를 삽입하는 작업
ACTION 코드 조회 방법
SQL로 확인
-- 표준 액션 코드 확인
SELECT action, name
FROM audit_actions
ORDER BY action;
-- 또는 시스템 뷰에서
SELECT action_name, action
FROM dba_audit_trail
WHERE action IS NOT NULL
GROUP BY action_name, action
ORDER BY action;