객체 상태와 소스 조회
USER_OBJECTS, USER_ARGUMENTS, USER_SOURCE와 USER_TRIGGERS로 저장 프로그램의 상태, 인자와 소스를 조회하는 방법
#핵심 요약
실습에서는 만든 객체의 상태, 소스, 매개변수, 의존관계를 데이터 사전에서 조회하는 것을 "이행할 때 가장 먼저 하는 일"로 정리했음
시작 전 객체 유형별 개수를 기록해 두고, 실습 뒤 다시 세어 같은지로 이행 소스가 오염되지 않았는지 확인했음
컴파일 상태가 VALID여도 모든 실행 경로가 정상이라는 뜻은 아님
반환이 빠진 경로가 있는 함수도 VALID로 컴파일됨(호출 오류와 실행 제약)
#개념과 동작 원리
| 데이터 사전 뷰 | 조회하는 객체 정보 |
|---|---|
SESSION_PRIVS |
CREATE PROCEDURE, CREATE TRIGGER, CREATE TABLE 권한 여부주석은 RESOURCE 롤에 들어 있다고 적음 |
USER_OBJECTS |
객체 유형별 개수, 이름, STATUS, LAST_DDL_TIME |
USER_ARGUMENTS |
매개변수의 위치, 이름, IN_OUT, 데이터 타입, 기본값 유무(DEFAULTED)실습에서는 "이행할 때 다른 DB 문법으로 다시 쓸 머리 부분"이라고 설명 |
USER_SOURCE |
프로그램 소스를 줄 번호(LINE)와 함께 |
USER_TRIGGERS |
트리거 유형(BEFORE EACH ROW, AFTER EACH ROW, BEFORE STATEMENT), 이벤트, 상태 |
USER_DEPENDENCIES |
실습 비교표에서 함수 조회 대상으로 언급 조회문은 기재 없음 |
실습에서는 이 조회로 직접 만든 프로시저와 이행 대상 add_order의 소스를 나란히 읽었음add_order도 같은 뼈대(IS → BEGIN → EXCEPTION → END)에 COMMIT, ROLLBACK, SQLERRM이 들어 있어, 소스 DB의 프로시저도 결국 몇 가지 문법의 조합이라는 것을 확인했음(add_order 소스 본문은 확인 불가)
#필수 명령어 또는 SQL
#권한과 시작 전 객체 수
SELECT * FROM session_privs
WHERE privilege IN ('CREATE PROCEDURE', 'CREATE TRIGGER', 'CREATE TABLE');
SELECT object_type, COUNT(*) AS cnt
FROM user_objects
GROUP BY object_type
ORDER BY object_type;결과 해석:
설명: 두 번째 결과를 따로 보관했다가 실습 뒤 같은 조회로 대조함
실습에서는 마지막 단계에서 실습 객체를 모두 지우고 개수를 비교한다고 적었지만, 그 삭제 단계 자체는 수업 자료 본문에 없음
#프로시저 상태, 매개변수, 소스
SELECT object_name, status, last_ddl_time
FROM user_objects
WHERE object_type = 'PROCEDURE'
ORDER BY object_name;
SELECT object_name, position, argument_name, in_out, data_type, defaulted
FROM user_arguments
WHERE object_name IN ('P_RAISE_SAL', 'P_DEPT_STAT')
ORDER BY object_name, position;
SELECT line, text FROM user_source WHERE name = 'P_RAISE_SAL' ORDER BY line;결과 해석:
데이터 사전에는 이름이 대문자로 저장되므로 조건 값도 대문자로 씀P_RAISE_SAL, P_DEPT_STAT은 IN과 OUT 매개변수에서 만듦
#트리거 목록과 소스
SELECT table_name, trigger_name, trigger_type, triggering_event, status
FROM user_triggers
WHERE table_name IN ('EMP_T', 'ORDERS')
ORDER BY table_name, trigger_name;
SELECT line, text FROM user_source WHERE name = 'TRG_ORDERS_BI' ORDER BY line;결과 해석:
ORDERS와 TRG_ORDERS_BI는 실습 이행 소스 DB에 있던 객체임(변경 이력과 입력값 처리)