Skip to content

Instantly share code, notes, and snippets.

@kleontev
Created January 17, 2025 11:57
Show Gist options
  • Save kleontev/7e11e00a177757f80533e95316b9b304 to your computer and use it in GitHub Desktop.
Save kleontev/7e11e00a177757f80533e95316b9b304 to your computer and use it in GitHub Desktop.
SQL>
SQL> select banner from v$version;
BANNER
----------------------------------------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
1 row selected.
SQL>
SQL> drop table test_fk_detail_ix purge;
Table dropped.
SQL> drop table test_fk_detail_no_ix purge;
Table dropped.
SQL> drop table test_fk_master_ix purge;
Table dropped.
SQL> drop table test_fk_master_no_ix purge;
Table dropped.
SQL>
SQL> whenever sqlerror exit failure
SQL>
SQL> create table test_fk_master_ix(id int primary key);
Table created.
SQL> create table test_fk_master_no_ix(id int primary key);
Table created.
SQL>
SQL> create table test_fk_detail_ix(id int primary key, master_id int references test_fk_master_ix(id));
Table created.
SQL> create index ix_test_fk_detail_ix on test_fk_detail_ix(master_id);
Index created.
SQL>
SQL> create table test_fk_detail_no_ix(id int, master_id int references test_fk_master_no_ix(id));
Table created.
SQL>
SQL> insert into test_fk_master_ix values(1);
1 row created.
SQL> insert into test_fk_master_no_ix values(1);
1 row created.
SQL>
SQL> insert into test_fk_detail_ix values (1,1);
1 row created.
SQL> insert into test_fk_detail_no_ix values (1,1);
1 row created.
SQL>
SQL> commit;
Commit complete.
SQL>
SQL> whenever sqlerror continue
SQL>
SQL> -- 10704 deprecated since 12.2?
SQL> alter session set events 'trace[ksq] disk medium';
Session altered.
SQL>
SQL> delete test_fk_master_ix where id = 1;
delete test_fk_master_ix where id = 1
*
ERROR at line 1:
ORA-02292: integrity constraint (SYS_C0013126820) violated - child record found
SQL>
SQL> delete test_fk_master_no_ix where id = 1;
delete test_fk_master_no_ix where id = 1
*
ERROR at line 1:
ORA-02292: integrity constraint (SYS_C0013126821) violated - child record found
SQL>
SQL> break on trace_filename skip page duplicates
SQL>
SQL> select
2 -- trc.trace_filename,
3 to_char(object_id,'0XXXXXXX') object_id_hex,
4 uo.object_name,
5 uo.subobject_name,
6 regexp_substr(trc.payload, 'mode=[0-9]') lock_mode,
7 trc.payload
8 from user_objects uo
9 join v$diag_trace_file_contents trc on 1 = 1
10 and (trc.session_id, trc.serial#) = (select sid, serial# from v$session where sid = userenv('sid'))
11 and trc.payload like '%TM-' || to_char(uo.object_id, 'FM0XXXXXXX') || '%'
12 where uo.object_name like 'TEST\_FK%' escape '\'
13 order by uo.object_name, lock_mode, trc.timestamp;
OBJECT_ID_HEX OBJECT_NAME SUBOBJECT_NAME LOCK_MODE PAYLOAD
--------------------------- ------------------------------ --------------- --------- ------------------------------------------------------------------------------------------------------------------------------------------------------
18BAFAD3 TEST_FK_DETAIL_IX mode=0 2025-01-17 14:50:16.097*:ksq.c@7302:ksqcmi(): ksqcmi TM-18BAFAD3-00000000-4ABDF995-00000000 mode=0 timeout=0 lockmode=3 lockreq=0
18BAFAD3 TEST_FK_DETAIL_IX mode=3 2025-01-17 14:50:16.096*:ksq.c@9213:ksqgtlctx(): *** TM-18BAFAD3-00000000-4ABDF995-00000000 mode=3 flags=0x401 why=173 timeout=21474836 ***
18BAFAD3 TEST_FK_DETAIL_IX mode=3 2025-01-17 14:50:16.096*:ksq.c@7302:ksqcmi(): ksqcmi TM-18BAFAD3-00000000-4ABDF995-00000000 mode=3 timeout=21474836 lockmode=0 lockreq=0
18BAFAD6 TEST_FK_DETAIL_NO_IX mode=0 2025-01-17 14:50:16.222*:ksq.c@7302:ksqcmi(): ksqcmi TM-18BAFAD6-00000000-4ABDF995-00000000 mode=0 timeout=0 lockmode=4 lockreq=0
18BAFAD6 TEST_FK_DETAIL_NO_IX mode=0 2025-01-17 14:50:16.223*:ksq.c@7302:ksqcmi(): ksqcmi TM-18BAFAD6-00000000-4ABDF995-00000000 mode=0 timeout=0 lockmode=4 lockreq=0
18BAFAD6 TEST_FK_DETAIL_NO_IX mode=4 2025-01-17 14:50:16.222*:ksq.c@9213:ksqgtlctx(): *** TM-18BAFAD6-00000000-4ABDF995-00000000 mode=4 flags=0x401 why=173 timeout=21474836 ***
18BAFAD6 TEST_FK_DETAIL_NO_IX mode=4 2025-01-17 14:50:16.222*:ksq.c@7302:ksqcmi(): ksqcmi TM-18BAFAD6-00000000-4ABDF995-00000000 mode=4 timeout=21474836 lockmode=0 lockreq=0
18BAFAD6 TEST_FK_DETAIL_NO_IX mode=4 2025-01-17 14:50:16.223*:ksq.c@9213:ksqgtlctx(): *** TM-18BAFAD6-00000000-4ABDF995-00000000 mode=4 flags=0x401 why=173 timeout=21474836 ***
18BAFAD6 TEST_FK_DETAIL_NO_IX mode=4 2025-01-17 14:50:16.223*:ksq.c@7302:ksqcmi(): ksqcmi TM-18BAFAD6-00000000-4ABDF995-00000000 mode=4 timeout=21474836 lockmode=0 lockreq=0
18BAFACF TEST_FK_MASTER_IX mode=0 2025-01-17 14:50:16.097*:ksq.c@7302:ksqcmi(): ksqcmi TM-18BAFACF-00000000-4ABDF995-00000000 mode=0 timeout=0 lockmode=3 lockreq=0
18BAFACF TEST_FK_MASTER_IX mode=3 2025-01-17 14:50:16.096*:ksq.c@9213:ksqgtlctx(): *** TM-18BAFACF-00000000-4ABDF995-00000000 mode=3 flags=0x401 why=173 timeout=21474836 ***
18BAFACF TEST_FK_MASTER_IX mode=3 2025-01-17 14:50:16.096*:ksq.c@7302:ksqcmi(): ksqcmi TM-18BAFACF-00000000-4ABDF995-00000000 mode=3 timeout=21474836 lockmode=0 lockreq=0
18BAFAD1 TEST_FK_MASTER_NO_IX mode=0 2025-01-17 14:50:16.224*:ksq.c@7302:ksqcmi(): ksqcmi TM-18BAFAD1-00000000-4ABDF995-00000000 mode=0 timeout=0 lockmode=3 lockreq=0
18BAFAD1 TEST_FK_MASTER_NO_IX mode=3 2025-01-17 14:50:16.222*:ksq.c@9213:ksqgtlctx(): *** TM-18BAFAD1-00000000-4ABDF995-00000000 mode=3 flags=0x401 why=173 timeout=21474836 ***
18BAFAD1 TEST_FK_MASTER_NO_IX mode=3 2025-01-17 14:50:16.222*:ksq.c@7302:ksqcmi(): ksqcmi TM-18BAFAD1-00000000-4ABDF995-00000000 mode=3 timeout=21474836 lockmode=0 lockreq=0
15 rows selected.
SQL>
SQL> exit
col lock_mode for a9
col object_name for a30
col payload for a150
col subobject_name for a15
col trace_filename for a50
col banner for a100
set echo on
set lines 300
set time off
set timi off
cl scr
set sqlprompt "SQL> "
spool test_delete_fk.log replace
select banner from v$version;
drop table test_fk_detail_ix purge;
drop table test_fk_detail_no_ix purge;
drop table test_fk_master_ix purge;
drop table test_fk_master_no_ix purge;
whenever sqlerror exit failure
create table test_fk_master_ix(id int primary key);
create table test_fk_master_no_ix(id int primary key);
create table test_fk_detail_ix(id int primary key, master_id int references test_fk_master_ix(id));
create index ix_test_fk_detail_ix on test_fk_detail_ix(master_id);
create table test_fk_detail_no_ix(id int, master_id int references test_fk_master_no_ix(id));
insert into test_fk_master_ix values(1);
insert into test_fk_master_no_ix values(1);
insert into test_fk_detail_ix values (1,1);
insert into test_fk_detail_no_ix values (1,1);
commit;
whenever sqlerror continue
-- 10704 deprecated since 12.2?
alter session set events 'trace[ksq] disk medium';
delete test_fk_master_ix where id = 1;
delete test_fk_master_no_ix where id = 1;
break on trace_filename skip page duplicates
select
-- trc.trace_filename,
to_char(object_id,'0XXXXXXX') object_id_hex,
uo.object_name,
uo.subobject_name,
regexp_substr(trc.payload, 'mode=[0-9]') lock_mode,
trc.payload
from user_objects uo
join v$diag_trace_file_contents trc on 1 = 1
and (trc.session_id, trc.serial#) = (select sid, serial# from v$session where sid = userenv('sid'))
and trc.payload like '%TM-' || to_char(uo.object_id, 'FM0XXXXXXX') || '%'
where uo.object_name like 'TEST\_FK%' escape '\'
order by uo.object_name, lock_mode, trc.timestamp;
exit
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment