-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtrigger.sql
More file actions
192 lines (163 loc) · 5.65 KB
/
trigger.sql
File metadata and controls
192 lines (163 loc) · 5.65 KB
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
SET SCHEMA 'public';
SET CLIENT_MIN_MESSAGES TO WARNING;
BEGIN;
-- Create function to populate path cache
CREATE OR REPLACE FUNCTION container_path_cache_fn()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.parent_container_id IS NOT NULL THEN
NEW.path_cache := (
WITH RECURSIVE t AS ((
SELECT 0 AS depth, c.name, c.container_id,
c.parent_container_id
FROM container AS c
WHERE container_id = NEW.parent_container_id
) UNION ALL (
SELECT t.depth + 1 AS depth, c.name, t.container_id,
c.parent_container_id
FROM container AS c
JOIN t ON c.container_id = t.parent_container_id
WHERE depth <= 20
))
SELECT STRING_AGG(name, '/' ORDER BY depth DESC) AS path
FROM t
GROUP BY container_id
) || '/' || NEW.name;
ELSE
NEW.path_cache := NEW.name;
END IF;
RETURN NEW;
END; $$ LANGUAGE 'plpgsql';
-- Set trigger to populate path cache
DROP TRIGGER IF EXISTS container_path_cache_tr ON container;
CREATE TRIGGER container_path_cache_tr
BEFORE INSERT OR UPDATE ON container
FOR EACH ROW EXECUTE PROCEDURE container_path_cache_fn();
-- Create function/trigger for inventory change logging
CREATE OR REPLACE FUNCTION inventory_container_log_fn()
RETURNS TRIGGER AS $$
BEGIN
IF TG_OP = 'INSERT' THEN
IF NEW.container_id IS NOT NULL THEN
INSERT INTO inventory_container_log (
inventory_id, destination
) VALUES (
NEW.inventory_id, (
SELECT path_cache FROM container
WHERE container_id = NEW.container_id
)
);
END IF;
ELSIF TG_OP = 'UPDATE' THEN
IF COALESCE(OLD.container_id, 0) <> COALESCE(NEW.container_id, 0) THEN
INSERT INTO inventory_container_log (
inventory_id, destination
) VALUES (
NEW.inventory_id, (
SELECT path_cache FROM container
WHERE container_id = NEW.container_id
)
);
END IF;
END IF;
RETURN NEW;
END; $$ LANGUAGE 'plpgsql';
DROP TRIGGER IF EXISTS inventory_container_log_tr ON inventory;
CREATE TRIGGER inventory_container_log_tr
AFTER INSERT OR UPDATE ON inventory
FOR EACH ROW EXECUTE PROCEDURE inventory_container_log_fn();
-- Create function/trigger for container change logging
CREATE OR REPLACE FUNCTION container_log_fn()
RETURNS TRIGGER AS $$
BEGIN
IF TG_OP = 'INSERT' THEN
IF NEW.parent_container_id IS NOT NULL THEN
INSERT INTO container_log (
container_id, destination
) VALUES (
NEW.container_id, (
SELECT path_cache FROM container
WHERE container_id = NEW.parent_container_id
)
);
END IF;
ELSIF TG_OP = 'UPDATE' THEN
IF COALESCE(OLD.parent_container_id, 0) <> COALESCE(NEW.parent_container_id, 0) THEN
INSERT INTO container_log (
container_id, destination
) VALUES (
NEW.container_id, (
SELECT path_cache FROM container
WHERE container_id = NEW.parent_container_id
)
);
END IF;
END IF;
RETURN NEW;
END; $$ LANGUAGE 'plpgsql';
DROP TRIGGER IF EXISTS container_log_tr ON container;
CREATE TRIGGER container_log_tr
AFTER INSERT OR UPDATE ON container
FOR EACH ROW EXECUTE PROCEDURE container_log_fn();
-- Create function for modified date touching on update/insert
CREATE OR REPLACE FUNCTION modified_date_fn()
RETURNS TRIGGER AS $$
BEGIN
NEW.modified_date = NOW();
RETURN NEW;
END; $$ language 'plpgsql';
-- Create function for modified user touching on update/insert
CREATE OR REPLACE FUNCTION modified_user_fn()
RETURNS TRIGGER AS $$
BEGIN
IF session_user <> 'gmc_app' OR NEW.modified_user IS NULL THEN
NEW.modified_user = session_user;
END IF;
RETURN NEW;
END; $$ language 'plpgsql';
-- Set trigger for inventory modified date
DROP TRIGGER IF EXISTS inventory_modified_date_tr ON inventory;
CREATE TRIGGER inventory_modified_date_tr BEFORE INSERT OR UPDATE ON inventory
FOR EACH ROW EXECUTE PROCEDURE modified_date_fn();
-- Set trigger for inventory modified user
DROP TRIGGER IF EXISTS inventory_modified_user_tr ON inventory;
CREATE TRIGGER inventory_modified_user_tr BEFORE INSERT OR UPDATE ON inventory
FOR EACH ROW EXECUTE PROCEDURE modified_user_fn();
-- Set trigger for outcrop modified date
DROP TRIGGER IF EXISTS outcrop_modified_date_tr ON outcrop;
CREATE TRIGGER outcrop_modified_date_tr BEFORE INSERT OR UPDATE ON outcrop
FOR EACH ROW EXECUTE PROCEDURE modified_date_fn();
-- Set trigger for outcrop modified user
DROP TRIGGER IF EXISTS outcrop_modified_user_tr ON outcrop;
CREATE TRIGGER outcrop_modified_user_tr BEFORE INSERT OR UPDATE ON outcrop
FOR EACH ROW EXECUTE PROCEDURE modified_user_fn();
-- Set trigger for borehole modified date
DROP TRIGGER IF EXISTS borehole_modified_date_tr ON borehole;
CREATE TRIGGER borehole_modified_date_tr BEFORE INSERT OR UPDATE ON borehole
FOR EACH ROW EXECUTE PROCEDURE modified_date_fn();
-- Set trigger for borehole modified user
DROP TRIGGER IF EXISTS borehole_modified_user_tr ON borehole;
CREATE TRIGGER borehole_modified_user_tr BEFORE INSERT OR UPDATE ON borehole
FOR EACH ROW EXECUTE PROCEDURE modified_user_fn();
-- Set trigger for well modified date
DROP TRIGGER IF EXISTS well_modified_date_tr ON well;
CREATE TRIGGER well_modified_date_tr BEFORE INSERT OR UPDATE ON well
FOR EACH ROW EXECUTE PROCEDURE modified_date_fn();
-- Set trigger for well modified user
DROP TRIGGER IF EXISTS well_modified_user_tr ON well;
CREATE TRIGGER well_modified_user_tr BEFORE INSERT OR UPDATE ON well
FOR EACH ROW EXECUTE PROCEDURE modified_user_fn();
-- Setup automatic md5 hashing for files
CREATE OR REPLACE FUNCTION content_md5_fn()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.content IS NOT NULL AND NEW.content_md5 IS NULL THEN
NEW.content_md5 = md5(NEW.content);
END IF;
RETURN NEW;
END; $$ LANGUAGE 'plpgsql';
DROP TRIGGER IF EXISTS content_md5_tr ON file;
CREATE TRIGGER content_md5_tr
BEFORE INSERT OR UPDATE ON file
FOR EACH ROW EXECUTE PROCEDURE content_md5_fn();
COMMIT;