활용하기 - USER_SOURCE
만약 USER_SOURCE 테이블을 활용하지 않는다면, 모든 저장 오브젝트(프로시저, 함수, 트리거 등)를 하나씩 열어서 내용을 확인해야한다. 여기서는 HR을 예로 들어서 하나씩 찾아 확인해도 문제없지만 저장 오브젝트가 많다면 시간이 많이 걸릴것이다.
1) 사용자 확인
워크시트>
SHOW USER
스크립트 출력>
USER이(가) "HR"입니다.
2) USER_SOURCE 컬럼 이름과 데이터 타입 확인
워크시트>
DESC USER_SOURCE
스크립트 출력>
이름 널? 유형
---- -- --------------
NAME VARCHAR2(30)
TYPE VARCHAR2(12)
LINE NUMBER
TEXT VARCHAR2(4000)
3) HR의 저장 오브젝트 중에 UPDATE 사용하는 것 찾기
워크시트>
SELECT *
FROM USER_SOURCE
WHERE TEXT LIKE '%DELETE%';
스크립트 출력>
NAME TYPE LINE TEXT
SECURE_EMPLOYEES TRIGGER 2 " BEFORE INSERT OR UPDATE OR DELETE ON employees"
결과 내용을 보면
트리거 SECURE_EMPLOYEES에서 UPDATE를 사용하고 있다.
4) 트리거 SECURE_EMPLOYEES 열기
create or replace TRIGGER secure_employees
BEFORE INSERT OR UPDATE OR DELETE ON employees
BEGIN
secure_dml;
END secure_employees;
5) 트리거에서 사용하는 secure_dml 찾기
워크시트>
-- NAME과 TYPE 에서 중복을 제거함
SELECT DISTINCT NAME, TYPE
FROM USER_SOURCE
WHERE NAME = UPPER('secure_dml');
스크립트 출력>
NAME TYPE
SECURE_DML PROCEDURE
6) 프로시저 SECURE_DML 열기
create or replace PROCEDURE secure_dml
IS
BEGIN
IF TO_CHAR (SYSDATE, 'HH24:MI') NOT BETWEEN '08:00' AND '18:00'
OR TO_CHAR (SYSDATE, 'DY') IN ('SAT', 'SUN') THEN
RAISE_APPLICATION_ERROR (-20205,
'You may only make changes during normal office hours');
END IF;
END secure_dml;
해석을 잠시해보면
현재 날짜의 시간이 08:00에서 18:00 사이가 아니고, 또는 토요일, 일요일이라면
'You may only make changes during normal office hours'
이런 에러 메시지를 보여줘라.