종속 객체가 수정 테이블에서 특정 열을 참조하거나 의존하는 객체의 상태를 변경하지 않습니다 정말 다른 열을 삭제하는 경우 ...
사실,하지만 당신이 아닌 경우 명시 적으로 열을 참조 하시겠습니까? 세 개의 객체가 유효이 시점에서
create table test (num1 number, num2 number);
create or replace procedure refvirew_intab is
begin
for r in (select * from test) loop
dbms_output.put_line(r.num1);
end loop;
end;
/
: 이전 질문에서 셋업을 사용하여
는
, 여기가 이해 수있는 예입니다. 열에 부가 다시 경우
OBJECT_NAME OBJECT_TYPE STATUS
-------------------- ------------------- -------
REFVIREW_INTAB PROCEDURE INVALID
TEST TABLE VALID
VEXTEST VIEW VALID
상기 절차 대신 볼에 대해 생성된다 : 다음 절차 무효화
alter table test drop column num2;
: I는 미사용 num2
열 놓으면
create or replace view vextest as (select num1 from test);
create or replace procedure refvirew_intab is
begin
for r in (select * from vextest) loop
dbms_output.put_line(r.num1);
end loop;
end;
/
이제 테이블을 수정해도 아무 효과가 없습니다.
alter table test drop column num2;
Table TEST altered.
select object_name, object_type, status
from user_objects
where object_name in ('TEST' ,'VEXTEST', 'REFVIREW_INTAB')
order by object_name;
OBJECT_NAME OBJECT_TYPE STATUS
-------------------- ------------------- -------
REFVIREW_INTAB PROCEDURE VALID
TEST TABLE VALID
VEXTEST VIEW VALID
이제 알다시피, 이것은 select *
에서만 작동합니다. 테이블 버전이 select num1
인 경우 질문에서 제안한 것처럼 두 번째 열을 삭제해도 프로 시저에 아무런 영향을 미치지 않습니다. 그리고 select *
을 사용하면 눈살을 찌푸리게됩니다. 이 경우 프로 시저는 자동으로 다시 컴파일되고 삭제 된 열에 대한 참조가 실제로없는 한 성공적으로 다시 컴파일됩니다.
또 다른 시나리오는 앞의 예와 같이 열 이름을 지정하지 않고 표에 삽입하는 것입니다 (즉, frowned). 이 경우 테이블 정의를 변경하면 다른 숫자/순서/유형의 열로 끝나면 성공적으로 다시 컴파일되지 않으므로 다소 심각한 문제가 발생할 수 있습니다. instead of
트리거를 통해 뷰에 삽입하는 경우 프로 시저는 상관 없습니다. (트리거는 다음과 같습니다. 은 수행중인 작업에 따라이 다시 컴파일되지 않을 수 있습니다). 그것은 문서에서 첫 번째 글 머리 기호와 관련이 있지만 두 번째 질문은 아닙니다. 열을 떨어 뜨리는데도 적용됩니다.
정말 유용한 조언인지 여부는 논쟁의 여지가 있습니다. select *
을 사용하거나 열 이름을 지정하지 않고 삽입하는 사람들이 있으며 그 중 일부는보기를 사용하여 이러한 가끔 부작용을 피할 수 있습니다. 나는 종속 객체 무효화의 가능성을 피하기위한 뷰 레이어가 추가 관리의 가치가있는 시나리오를 볼 수 있는지 확신하지 못합니다. 그러나 일부 사람들은 아마 그렇게 할 것입니다.
일시적 으로라도 개체가 무효화되는 것을 볼 수 있습니다. 일반적으로 스키마 변경은 종속 개체에 대한 통합 된 업데이트를 포함하여 부작용이 올바르게 처리되도록 계획되고 제어 된 방식으로 수행되어야합니다. 그러나 또 다른 사람들은 다른 견해와 우선 순위를 가질 것입니다.