INSERT DML 문이 실행될 때, 일반적으로는 기존 데이터를
변경하지 않기 때문에 UNDO 세그먼트에는 "새 데이터가 추가되기 전의 상태"를 저장할 필요가 없다.
그러나 Oracle Database는 트랜잭션의 무결성을 보장하기 위해 일부 메타데이터와 관리 정보를 저장한다.
show parameter undo_retention

undo tablespace의 기본값은 no guarantee이다.
SELECT tablespace_name, contents, retention FROM dba_tablespaces;

undo retention을 undo segment 공간이 부족해도 보장하기 위해서는 guarantee 설정을 해줘야 한다.
ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;

하지만 guarantee를 보장하기 위해 다른 세션이 해당 undo segment를 공유 받지 못하는 경우 해당 세션의 DML 작업이 막힐 수 있다.
SELECT to_char(begin_time,'yyyy-mm-dd hh24:mi:ss'),
to_char(end_time,'yyyy-mm-dd hh24:mi:ss'),
undoblks -- undo시 사용 블록 수
FROM v$undostat;

SELECT to_char(begin_time,'yyyy-mm-dd'),sum(undoblks) as block_count, sum(undoblks)*8 as size_BYTE
FROM v$undostat
GROUP BY to_char(begin_time,'yyyy-mm-dd');

SELECT current_scn, scn_to_timestamp(current_scn)
FROM v$database;

UPDATE hr.emp_20
SET salary = 1000
WHERE employee_id = 201;
commit;
SELECT employee_id, salary
FROM hr.emp_20 AS OF TIMESTAMP TO_TIMESTAMP('2024-08-08 12:12:50','yyyy-mm-dd hh24:mi:ss');

3-1 interval 사용 query 수행
select employee_id,salary from hr.emp_30 AS OF TIMESTAMP systimestamp - interval '5' minute;
3-2 scn 사용 (단 이전 scn 번호를 알아야 사용 가능)
select employee_id,salary from hr.emp_30 AS OF SCN 3250000;
SELECT versions_xid, employee_id,salary
FROM hr.emp_30 VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE;
- versions_xid는 트랜잭션 id
- MINVALUE, MAXVALUE는 SCN의 최소 최대값
SELECT versions_xid, employee_id,salary
FROM hr.emp_30 VERSIONS BETWEEN TIMESTAMP SYSTIMESTAMP - INTERVAL '15' MINUTE AND SYSTIMESTAMP;
SELECT versions_xid,versions_operation, versions_starttime, employee_id,salary
FROM hr.emp_30 VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE;

SELECT * FROM database_properties;

CREATE TABLESPACE user_tbs
DATAFILE '/u01/app/oracle/oradata/ORA19C/user_tbs.dbf' SIZE 10M
AUTOEXTEND ON
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
SEGMENT SPACE MANAGEMENT AUTO;
CREATE TEMPORARY TABLESPACE user_temp
TEMPFILE '/u01/app/oracle/oradata/ORA19C/uesr_temp.dbf' SIZE 10M
AUTOEXTEND ON
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT MANUAL;
- TEMPORARY 테이블스페이스는 세그먼트 관리를 MANUAL로 해야한다.
ALTER DATABASE DEFAULT TABLESPACE user_tbs;
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE user_temp;
SELECT * FROM database_properties ORDER BY 1;
- CREATE USER 생성시 DEFAULT TABLESPACE를 지정해주지 않으면 데이터베이스 레벨에 설정되어있는 테이블스페이스로 등록된다.
- DEFAULT TABLESPACE와 DEFAULT TEMPORARY TABLESPACE 를 삭제하려고 하면 오류가 발생한다.

데이터베이스에 영향을 줄 수 있는 권한
권한 관리는 SYS가 한다.
권한 조회
SELECT * FROM dba_sys_privs;
권한부여
GRANT create session TO insa;
WITH ADMIN OPTION 으로 받은 시스템 권한에 대해서는 다른 유저에게 그 시스템 권한을 부여할 수 있다.GRANT create sequence TO insa WITH ADMIN OPTION; -- DBA 대신 INSA 유저가 권한 부여 가능
SELECT * FROM dba_sys_privs WHERE grantee='INSA';
⚠️ 주의할 점은 with admin option 으로 시스템 권한 부여 받은 1번 유저가 2번 유저에게 시스템 권한 부여 후 DBA가 1번 유저의 시스템 권한을 회수 한다고 해서 2번 유저의 시스템 권한이 같이 회수되지 않는다. DBA가 따로 회수를 진행해야 한다.
다른 유저가 소유한 객체를 액세스 할 수 있는 권한
권한 관리는 객체 소유자, SYS가 한다.
권한 조회
SELECT * FROM dba_tab_privs;
다른 유저가 생성한 객체에 대한 접근 권한 종류
TABLE : SELECT, INSERT, UPDATE, DELETE, ALTER, INDEX, REFERENCES
VIEW : SELECT, INSERT, UPDATE, DELETE
SEQUENCE : SELECT, ALTER
PROCEDURE, FUNCTION, PACKAGE : EXECUTE
트리거는 이벤트성 이기때문에 권한이 따로 없다.
WITH GRANT OPTION으로 받은 객체 권한에 대해서는 다른 유저에게 그 객체권한을 부여할 수 있다.GRANT SELECT ON hr.employees TO insa WITH GRANT OPTION;
SELECT * FROM dba_tab_privs WHERE grantee = 'INSA';
⚠️ 주의할 점은 with grant option으로 객체 권한 부여 받은 1번 유저가 2번 유저에게 객체 권한 부여 후 DBA가 1번 유저의 객체 권환을 회수하면 2번 유저의 객체 권한도 같이 회수된다.