프로시져를 만들때 위 그림처럼 참고하는 관계의 프로시져를 만든다고 생각해봅시다.
view와 table 의 관계는 아래처럼, 뷰는 dependent 객체이고, 테이블은 referenced 객체입니다.
현재 뷰의 상태는 정상입니다.
여기서 emp_copy 테이블을 드롭(drop)하면 어떻게 될까요?
의존 관계에 있기때문에 view의 상태는 비정상이 됩니다.
오라클 객체별 Dependencies 정보는 아래와 같습니다.
테이블(referenced 객체)의 변경이 항상 영향을 미치는것은 아니고 뷰(dependent 객체)와 직접적인 관련이 있는 영향을 미치고, 아니면 상관없습니다. 아래의 그림을 참고하세요. 뷰와 관련없는 컬럼이 추가되면 영향이 없습니다만, 뷰에서 보여주는 컬럼을 삭제한다면 당연히 뷰에 문제가 생깁니다.
- Example 1
--테스트 준비, 테이블 복사 및 뷰 생성
drop table emp_copy;
/
create table emp_copy
as
select * from employees;
/
select * from emp_copy;
/
create or replace view v_emp_copy
as
select * from emp_copy;
--뷰 상태확인
select object_name,object_type, status
from user_objects
where object_name='V_EMP_COPY';
/*
OBJECT_NAME OBJECT_TYPE STATUS
--------------- --------------- ----------
V_EMP_COPY VIEW VALID
*/
--원본 테이블(referenced 객체) 삭제
drop table emp_copy;
--뷰의 상태가 유효하지 않음
select object_name,object_type, status
from user_objects
where object_name='V_EMP_COPY';
/*
OBJECT_NAME OBJECT_TYPE STATUS
--------------- --------------- ----------
V_EMP_COPY VIEW INVALID
*/
--뷰 조회도 오류 발생
select * from v_emp_copy
/*
ORA-04063: view "HR.V_EMP_COPY" has errors
04063. 00000 - "%s has errors"
*Cause: Attempt to execute a stored procedure or use a view that has
errors. For stored procedures, the problem could be syntax errors
or references to other, non-existent procedures. For views,
the problem could be a reference in the view's defining query to
a non-existent table.
Can also be a table which has references to non-existent or
inaccessible types.
*Action: Fix the errors and/or create referenced objects as necessary.
Error at Line: 43 Column: 15
*/
- Example 2
--테스트 준비, 테이블 복사 및 뷰 생성
drop table dept_copy;
/
create table dept_copy
as
select * from departments;
/
select * from dept_copy;
/
create or replace view v_dept_copy
as
select department_id, department_name
from dept_copy;
--뷰 상태 확인
select object_name,object_type, status
from user_objects
where object_name='V_DEPT_COPY';
/*
OBJECT_NAME OBJECT_TYPE STATUS
--------------- --------------- ----------
V_DEPT_COPY VIEW VALID
*/
--원본 테이블(referenced 객체) 새로운 컬럼 추가
ALTER TABLE dept_copy
ADD ( DSIZE NUMBER);
--뷰 상태확인, 뷰와 관련 없는 컬럼을 추가했으므로 상태는 정상임
select object_name,object_type, status
from user_objects
where object_name='V_DEPT_COPY';
/*
OBJECT_NAME OBJECT_TYPE STATUS
--------------- --------------- ----------
V_DEPT_COPY VIEW VALID
*/
--원본 테이블(referenced 객체) 뷰와 관련있는 컬럼 삭제
alter table dept_copy
drop column department_name;
--뷰의 상태는 예상한대로 비정상
select object_name,object_type, status 임
from user_objects
where object_name='V_DEPT_COPY';
/*
OBJECT_NAME OBJECT_TYPE STATUS
--------------- --------------- ----------
V_DEPT_COPY VIEW INVALID
*/
'Database > PLSQL' 카테고리의 다른 글
109 - [Oracle PL/SQL] Dependencies - 객체의 4가지 상태 (0) | 2024.05.17 |
---|---|
108 - [Oracle PL/SQL] Dependencies - Direct/Indirect (0) | 2024.05.15 |
106 - [Oracle PL/SQL] Managing Code - Wrapper Utility (0) | 2024.05.15 |
105 - [Oracle PL/SQL] Managing Code - dbms_ddl (0) | 2024.05.15 |
104 - [Oracle PL/SQL] Managing Code - Obfuscation (0) | 2024.05.15 |