triggers.sql
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:5k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. create table pkeys (pkey1 int4 not null, pkey2 text not null);
  2. create table fkeys (fkey1 int4, fkey2 text, fkey3 int);
  3. create table fkeys2 (fkey21 int4, fkey22 text, pkey23 int not null);
  4. create index fkeys_i on fkeys (fkey1, fkey2);
  5. create index fkeys2_i on fkeys2 (fkey21, fkey22);
  6. create index fkeys2p_i on fkeys2 (pkey23);
  7. insert into pkeys values (10, '1');
  8. insert into pkeys values (20, '2');
  9. insert into pkeys values (30, '3');
  10. insert into pkeys values (40, '4');
  11. insert into pkeys values (50, '5');
  12. insert into pkeys values (60, '6');
  13. create unique index pkeys_i on pkeys (pkey1, pkey2);
  14. --
  15. -- For fkeys:
  16. --  (fkey1, fkey2) --> pkeys (pkey1, pkey2)
  17. --  (fkey3) --> fkeys2 (pkey23)
  18. --
  19. create trigger check_fkeys_pkey_exist 
  20. before insert or update on fkeys 
  21. for each row 
  22. execute procedure 
  23. check_primary_key ('fkey1', 'fkey2', 'pkeys', 'pkey1', 'pkey2');
  24. create trigger check_fkeys_pkey2_exist 
  25. before insert or update on fkeys 
  26. for each row 
  27. execute procedure check_primary_key ('fkey3', 'fkeys2', 'pkey23');
  28. --
  29. -- For fkeys2:
  30. --  (fkey21, fkey22) --> pkeys (pkey1, pkey2)
  31. --
  32. create trigger check_fkeys2_pkey_exist 
  33. before insert or update on fkeys2 
  34. for each row 
  35. execute procedure 
  36. check_primary_key ('fkey21', 'fkey22', 'pkeys', 'pkey1', 'pkey2');
  37. --
  38. -- For pkeys:
  39. --  ON DELETE/UPDATE (pkey1, pkey2) CASCADE:
  40. --  fkeys (fkey1, fkey2) and fkeys2 (fkey21, fkey22)
  41. --
  42. create trigger check_pkeys_fkey_cascade
  43. before delete or update on pkeys 
  44. for each row 
  45. execute procedure 
  46. check_foreign_key (2, 'cascade', 'pkey1', 'pkey2', 
  47. 'fkeys', 'fkey1', 'fkey2', 'fkeys2', 'fkey21', 'fkey22');
  48. --
  49. -- For fkeys2:
  50. --  ON DELETE/UPDATE (pkey23) RESTRICT:
  51. --  fkeys (fkey3)
  52. --
  53. create trigger check_fkeys2_fkey_restrict 
  54. before delete or update on fkeys2
  55. for each row 
  56. execute procedure check_foreign_key (1, 'restrict', 'pkey23', 'fkeys', 'fkey3');
  57. insert into fkeys2 values (10, '1', 1);
  58. insert into fkeys2 values (30, '3', 2);
  59. insert into fkeys2 values (40, '4', 5);
  60. insert into fkeys2 values (50, '5', 3);
  61. -- no key in pkeys
  62. insert into fkeys2 values (70, '5', 3);
  63. insert into fkeys values (10, '1', 2);
  64. insert into fkeys values (30, '3', 3);
  65. insert into fkeys values (40, '4', 2);
  66. insert into fkeys values (50, '5', 2);
  67. -- no key in pkeys
  68. insert into fkeys values (70, '5', 1);
  69. -- no key in fkeys2
  70. insert into fkeys values (60, '6', 4);
  71. delete from pkeys where pkey1 = 30 and pkey2 = '3';
  72. delete from pkeys where pkey1 = 40 and pkey2 = '4';
  73. update pkeys set pkey1 = 7, pkey2 = '70' where pkey1 = 50 and pkey2 = '5';
  74. update pkeys set pkey1 = 7, pkey2 = '70' where pkey1 = 10 and pkey2 = '1';
  75. DROP TABLE pkeys;
  76. DROP TABLE fkeys;
  77. DROP TABLE fkeys2;
  78. create table dup17 (x int4);
  79. create trigger dup17_before 
  80. before insert on dup17
  81. for each row 
  82. execute procedure 
  83. funny_dup17 ()
  84. ;
  85. insert into dup17 values (17);
  86. select count(*) from dup17;
  87. insert into dup17 values (17);
  88. select count(*) from dup17;
  89. drop trigger dup17_before on dup17;
  90. create trigger dup17_after
  91. after insert on dup17
  92. for each row 
  93. execute procedure 
  94. funny_dup17 ()
  95. ;
  96. insert into dup17 values (13);
  97. select count(*) from dup17 where x = 13;
  98. insert into dup17 values (13);
  99. select count(*) from dup17 where x = 13;
  100. DROP TABLE dup17;
  101. create sequence ttdummy_seq increment 10 start 0 minvalue 0;
  102. create table tttest (
  103. price_id int4, 
  104. price_val int4, 
  105. price_on int4,
  106. price_off int4 default 999999
  107. );
  108. create trigger ttdummy 
  109. before delete or update on tttest
  110. for each row 
  111. execute procedure 
  112. ttdummy (price_on, price_off);
  113. create trigger ttserial 
  114. before insert or update on tttest
  115. for each row 
  116. execute procedure 
  117. autoinc (price_on, ttdummy_seq);
  118. insert into tttest values (1, 1, null);
  119. insert into tttest values (2, 2, null);
  120. insert into tttest values (3, 3, 0);
  121. select * from tttest;
  122. delete from tttest where price_id = 2;
  123. select * from tttest;
  124. -- what do we see ?
  125. -- get current prices
  126. select * from tttest where price_off = 999999;
  127. -- change price for price_id == 3
  128. update tttest set price_val = 30 where price_id = 3;
  129. select * from tttest;
  130. -- now we want to change pric_id in ALL tuples
  131. -- this gets us not what we need
  132. update tttest set price_id = 5 where price_id = 3;
  133. select * from tttest;
  134. -- restore data as before last update:
  135. select set_ttdummy(0);
  136. delete from tttest where price_id = 5;
  137. update tttest set price_off = 999999 where price_val = 30;
  138. select * from tttest;
  139. -- and try change price_id now!
  140. update tttest set price_id = 5 where price_id = 3;
  141. select * from tttest;
  142. -- isn't it what we need ?
  143. select set_ttdummy(1);
  144. -- we want to correct some "date"
  145. update tttest set price_on = -1 where price_id = 1;
  146. -- but this doesn't work
  147. -- try in this way
  148. select set_ttdummy(0);
  149. update tttest set price_on = -1 where price_id = 1;
  150. select * from tttest;
  151. -- isn't it what we need ?
  152. -- get price for price_id == 5 as it was @ "date" 35
  153. select * from tttest where price_on <= 35 and price_off > 35 and price_id = 5;
  154. drop table tttest;
  155. drop sequence ttdummy_seq;