2013-01-21 6 views
2

삭제 캐스케이드에 의해 삭제 된 행 수. 사용자가 많은 테이블에서 참조로오라클은 성명을 삭제 : 내가 SQLDeveloper에서</p> <pre><code>DELETE FROM USER WHERE USER_ID=1; </code></pre> <p>같은 문을 실행하고있어

우리는 우리가 수동으로 각각의 모든 행을 삭제하지 않도록 ON이 CASCADE 삭제 활성화 (예를 들어, 사용자가 순서, 설정, ...있다). 그러나 개발하는 동안 계단식 삭제로 "자동으로"삭제되는 행 수 및 테이블 수를 파악하는 데 관심이 있습니다.

이 방법을 찾을 수있는 방법이 있습니까? SQL 문이나 sqldeveloper에서 직접 로그 파일이나 다른 아이디어를 구할 수 있습니까? 이 동안

+0

나는 이것이 가능하다고 생각하지 않습니다. –

+1

이 같은 기능을 알지 못합니다. 아무도 없습니다. 그러나 데이터 딕셔너리를 재귀 적으로 질의하고 (DBA_CONSTRAINTS보기), 영향을받은 행을 세부 테이블에 넣을 수 있습니다. –

답변

2

은 트리거 코드를 작성할 경우 가능,의 SQL %의 행 개수와 수 없습니다, 그러나 이것은 당신이 모니터링 할 모든 테이블에 트리거를해야한다는 것을 의미합니다. 또한 트리거를 사용하면 작업이 조금 느려집니다.

예 : 우리가 제로로이 카운트를 재설정하기 위해 최고 수준의 테이블에 트리거를 원하는

SQL> create or replace package foo 
    2 as 
    3 type rowcount_tab is table of pls_integer index by varchar2(30); 
    4 t_rowcount rowcount_tab; 
    5 end foo; 
    6/

Package created. 

:

SQL> select * from one; 

     ID 
---------- 
     1 
     2 

SQL> select * from child_of_one; 

     ID  O_ID 
---------- ---------- 
     1   1 
     2   1 
     3   1 
     4   2 
     5   2 
     6   2 
     7   2 
     8   2 

우리가 테이블 + 카운트의 배열을 유지하기 위해 패키지 사양을 원하는 :

SQL> create or replace trigger one_biud 
    2 before insert or update or delete 
    3 on one 
    4 declare 
    5 begin 
    6 foo.t_rowcount.delete; 
    7 end; 
    8/

Trigger created. 

여기서는 사용자가 최상위 레벨 테이블에서 삭제 된 어레이에만 관심이 있다고 가정합니다. 그렇지 않다면 foo.t_rowcount.delete('TABLE_NAME') 대신 각 테이블에 방아쇠를 설치하는 것이 좋습니다.

이제 관심의 각 테이블의 각 행 트리거를위한 ​​후에는 배열을 설정합니다 :

SQL> create or replace trigger one_aiudfer 
    2 after insert or update or delete 
    3 on one 
    4 for each row 
    5 declare 
    6 begin 
    7 if (foo.t_rowcount.exists('ONE')) 
    8 then 
    9  foo.t_rowcount('ONE') := nvl(foo.t_rowcount('ONE'), 0)+1; 
10 else 
11  foo.t_rowcount('ONE') := 1; 
12 end if; 
13 end; 
14/

Trigger created. 

SQL> create or replace trigger child_of_one_aiudfer 
    2 after insert or update or delete 
    3 on child_of_one 
    4 for each row 
    5 declare 
    6 begin 
    7 if (foo.t_rowcount.exists('CHILD_OF_ONE')) 
    8 then 
    9  foo.t_rowcount('CHILD_OF_ONE') := nvl(foo.t_rowcount('CHILD_OF_ONE'), 0)+1; 
10 else 
11  foo.t_rowcount('CHILD_OF_ONE') := 1; 
12 end if; 
13 end; 
14/

Trigger created. 

을 지금 우리는 삭제하거나 어떤 때

SQL> delete from one where id = 1; 

1 row deleted. 

SQL> declare 
    2 v_table varchar2(30); 
    3 begin 
    4 v_table := foo.t_rowcount.first; 
    5 loop 
    6  exit when v_table is null; 
    7    dbms_output.put_line(v_table || ' ' || foo.t_rowcount(v_table) || ' rows'); 
    8    v_table := foo.t_rowcount.next(v_table); 
    9  end loop; 
10 end; 
11/
CHILD_OF_ONE 3 rows 
ONE 1 rows 

PL/SQL procedure successfully completed. 

SQL> delete from one where id = 2; 

1 row deleted. 

SQL> declare 
    2 v_table varchar2(30); 
    3 begin 
    4 v_table := foo.t_rowcount.first; 
    5 loop 
    6  exit when v_table is null; 
    7    dbms_output.put_line(v_table || ' ' || foo.t_rowcount(v_table) || ' rows'); 
    8    v_table := foo.t_rowcount.next(v_table); 
    9  end loop; 
10 end; 
11/
CHILD_OF_ONE 5 rows 
ONE 1 rows