*第 1 行出现错误:
" t7 q& s& F& u+ f% D/ _4 d( x+ U ORA-02292: 违反完整约束条件 (YANGTK.FK_T_C) - 已找到子记录日志8 f6 }; \6 p' i# I# V6 y
下面构造一个触发器:
D4 M; E, e+ Y SQL> CREATE OR REPLACE TRIGGER T_P_UPDATE_SET_NULL
: F3 B: J3 K) M) z: q' b, O/ I 2 BEFORE UPDATE ON T_P
8 Z0 s0 M! j& x$ D 3 FOR EACH ROW4 E* `$ z) v" Y2 x. n' U
4 DECLARE
, F3 D' ~) m: s7 U2 h& a R 5 V_STR VARCHAR2(32767);
6 ?1 X$ g3 ?# D+ _( c 6 BEGIN7 {% I+ x; X; b6 k8 n$ v
7 IF NVL(:NEW.ID, -1) != NVL(:OLD.ID, -1) THEN0 W7 n+ { C7 e* R2 Q) w _# p# a& l
8 FOR I IN (SELECT OWNER, TABLE_NAME, CONSTRAINT_NAME / L2 M r* G! K. }4 X3 ^4 Q; O
9 FROM ALL_CONSTRAINTS7 S, A, q% M7 o! Z; q3 U- Q4 c
10 WHERE CONSTRAINT_TYPE = ’R’
1 k+ {/ W# H$ i8 \6 z v7 T# O4 B7 T 11 AND R_OWNER = ’YANGTK’
0 v0 e) P( [8 X! j+ o+ E! W 12 AND R_CONSTRAINT_NAME IN 8 x! x* l) I4 O7 O/ r* U, N$ h( p
13 (SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME = ’T_P’))+ t1 Y: v7 O5 t& K" g' h& x1 K, b
14 LOOP
7 s6 L, s* F E5 K* a 15 V_STR := ’UPDATE ’ || I.TABLE_NAME || ’ SET ’; / g) S% F: H7 ]
16 FOR J IN (SELECT COLUMN_NAME FROM ALL_CONS_COLUMNS
4 x, b, R- ?; c& i3 K 17 WHERE OWNER = I.OWNER2 n4 ~% {" A. G4 N, [# u/ \1 T
18 AND TABLE_NAME = I.TABLE_NAME
5 M6 S1 p) h+ H% D+ E* j; o 19 AND CONSTRAINT_NAME = I.CONSTRAINT_NAME)
7 z5 L3 |; E7 h 20 LOOP, J5 p. F+ n5 X1 X5 ?7 f' J1 w7 A8 k; p
21 V_STR := V_STR || J.COLUMN_NAME || ’ = NULL ’
! l" d* O/ }2 z5 n- J 22 || ’WHERE ’ || J.COLUMN_NAME || ’ = ’ || :OLD.ID;
4 h. T& {0 {' u5 I+ k, V 23 END LOOP;& w0 s5 [( ~) T
24 EXECUTE IMMEDIATE V_STR;
9 s( ^. b% ^3 L% p5 } 25 END LOOP;
2 u- a2 E% [6 u) F0 \6 g% B' d( ? 26 END IF;! p5 j$ E! P6 d) e
27 END;& \4 j9 I' T% y9 c1 l( P1 n
28 /
5 v* O! M) w& b. \0 e 触发器已创建/ J2 W% H) K3 v S ^1 |! N5 C
SQL> SELECT * FROM T_P;1 c& }$ `7 U; v0 b
ID NAME
* Q( W5 { [: l1 F" ^ j- ? ---------- ------------------------------
9 W( G+ _) o) ?( n9 o9 S 1 A
' ~$ l, K4 C: K3 k3 f 2 B
D! c. G. K: a+ {" k SQL> SELECT * FROM T_C;
$ Q4 ` E7 N! R* Z) b" t: h ID FID NAME
1 H8 t& t2 t0 b% C! l& ?; k ---------- ---------- ------------------------------& v/ ?+ I L6 p) w# a) E* H5 y) O% d% Y
1 1 A
4 l& b8 k6 C2 i, u8 [ SQL> UPDATE T_P SET ID = 3 WHERE ID = 1;
4 ~( S# }2 R' W2 b+ ~/ H 已更新 1 行。* _1 E9 E) ?6 b- [ m& A/ d
SQL> SELECT * FROM T_P;: ~) r9 h$ F% T* r# |/ q2 K! @ Q
ID NAME
( T# {6 y! u* F9 u; g ---------- ------------------------------
! W% g0 l5 v0 S( q/ z 3 A8 h2 u: g% G$ D# G/ I7 } i
2 B8 V; {7 X2 c4 t; W& k/ _4 _
SQL> SELECT * FROM T_C;/ k* I- N; q1 n8 K
ID FID NAME9 v% o0 t' ]/ a: S$ G" a& \! |
---------- ---------- ------------------------------ y$ ~# F; d1 M" r% M
1 A
) Q- O' l: w) E$ b8 T# u UPDATE SET NULL操作其实和UPDATE CASCADE很相似,不同之处无非是一个置为NULL,另一个置为主键的新值。 |