데이터베이스 연구실.log

객체 상태와 소스 조회

USER_OBJECTS, USER_ARGUMENTS, USER_SOURCE와 USER_TRIGGERS로 저장 프로그램의 상태, 인자와 소스를 조회하는 방법

USER_OBJECTSUSER_SOURCEUSER_ARGUMENTSUSER_TRIGGERSUSER_DEPENDENCIESSESSION_PRIVSVALIDINVALID

#핵심 요약

실습에서는 만든 객체의 상태, 소스, 매개변수, 의존관계를 데이터 사전에서 조회하는 것을 "이행할 때 가장 먼저 하는 일"로 정리했음

시작 전 객체 유형별 개수를 기록해 두고, 실습 뒤 다시 세어 같은지로 이행 소스가 오염되지 않았는지 확인했음

컴파일 상태가 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

#권한과 시작 전 객체 수

SQL*Plus (객체 소유 계정)조회만 함
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;

결과 해석:

설명: 두 번째 결과를 따로 보관했다가 실습 뒤 같은 조회로 대조함
실습에서는 마지막 단계에서 실습 객체를 모두 지우고 개수를 비교한다고 적었지만, 그 삭제 단계 자체는 수업 자료 본문에 없음

#프로시저 상태, 매개변수, 소스

SQL*Plus (객체 소유 계정)조회만 함
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 매개변수에서 만듦

#트리거 목록과 소스

SQL*Plus (객체 소유 계정)조회만 함
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에 있던 객체임(변경 이력과 입력값 처리)

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기