Salut à tous.

Je me suis attaqué aux triggers qui sont très différents de MySql et de FireBird, et ce que je connaissais sous DB2 Z/OS.

Le premier exercice consiste à simuler un "trigger before insert et update" sur une colonne ('quant') qui ne doit pas être NULL.
Le test se fait en deux phases :
--> je teste avec le trigger pour voir si les modification sont bien faites avant d'insérer les lignes dans la table.
--> je teste ensuite en désactivant le trigger et en refaisant l'insertion dans la table.
Voici le résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
-- ===========
-- Paramétrage
-- ===========
 
SET NOCOUNT    ON
 
-- ==================
-- Lien vers Database
-- ==================
 
use tempdb
 
Le contexte de la base de données a changé*; il est maintenant 'tempdb'.
 
-- ========================
-- Suppression Table 'test'
-- ========================
 
IF OBJECT_ID(N'dbo.test', N'U') IS NOT NULL
    DROP TABLE dbo.test
 
-- =====================
-- Création Table 'test'
-- =====================
 
create table dbo.test (
  id      smallint identity(1, 1) NOT NULL,
  quant   integer                 NOT NULL,
  date    datetime                NOT NULL,
  constraint pk_test_id   primary key clustered (id)
)
 
-- ==============================
-- Suppression Trigger 'modifier'
-- ==============================
 
IF OBJECT_ID(N'dbo.modifier', N'TR') IS NOT NULL
    DROP TRIGGER dbo.modifier
 
-- ===================
-- Trigger 'modifier'
-- ===================
 
CREATE TRIGGER dbo.modifier
ON dbo.test INSTEAD OF insert, update
AS
BEGIN
  IF NOT UPDATE(quant) RETURN
 
  IF EXISTS ( SELECT * FROM deleted     )
  BEGIN
    update dbo.test
      set quant = coalesce(i.quant, 0)
      from       inserted as i
      inner join dbo.test as t
      on t.id = i.id
  END
  ELSE
  BEGIN
    insert into dbo.test (quant, date)
      select coalesce(i.quant, 0) as quant, i.date
      from      inserted as i
      left join dbo.test as t
      on    t.id = i.id
          where t.id is null
  END
END
 
-- =====================
-- Insertion dans 'test'
-- =====================
 
INSERT INTO test (quant,date) VALUES
  (null,'2016-05-07 22:36:52'),
  (2,   '2016-05-12 15:00:23')
 
-- ================
-- Vidage de 'test'
-- ================
 
select * from test
 
id     quant       date
------ ----------- -----------------------
     1           0 2016-05-07 22:36:52.000
     2           2 2016-05-12 15:00:23.000
 
-- =======================
-- Mise à jour dans 'test'
-- =======================
 
UPDATE test set quant = null where id = 2;
 
-- ================
-- Vidage de 'test'
-- ================
 
select * from test
 
id     quant       date
------ ----------- -----------------------
     1           0 2016-05-07 22:36:52.000
     2           0 2016-05-12 15:00:23.000
 
-- =======================
-- On désactive le trigger
-- =======================
 
DISABLE TRIGGER dbo.modifier on dbo.test
 
-- ========================
-- On purge la table 'test'
-- ========================
 
truncate table dbo.test
 
-- =====================
-- Insertion dans 'test'
-- =====================
 
INSERT INTO test (quant,date) VALUES
  (null,'2016-05-07 22:36:52'),
  (2,   '2016-05-12 15:00:23')
 
Message 515, niveau 16, état 2, serveur ORION\SQLEXPRESS, ligne 5
Impossible d'insérer la valeur NULL dans la colonne 'quant', table 'tempdb.dbo.test'. Cette colonne n'accepte pas les valeurs NULL. Échec de INSERT.
L'instruction a été arrêtée.
-- ================
-- Vidage de 'test'
-- ================
 
select * from test
 
id     quant       date
------ ----------- -----------------------
 
Appuyez sur une touche pour continuer...
Vous me dites ce qui ne va pas ou encore, si vous avez une autre approche concernant ce "trigger before insert et update".

Merci !
@+