generated from teksi/template
-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathorganisation_functions.sql
139 lines (128 loc) · 3.63 KB
/
organisation_functions.sql
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
CREATE OR REPLACE FUNCTION tww_app.set_organisations_active(_undo_existing boolean default false)
RETURNS void AS
$BODY$
DECLARE
schm text;
tbl text;
col text;
BEGIN
IF _undo_existing THEN
UPDATE tww_od.organisation
SET tww_active=FALSE;
ELSE NULL;
END IF;
FOR schm,tbl,col IN
SELECT tc.table_schema,
tc.table_name,
kcu.column_name
FROM (SELECT constraint_name FROM information_schema.constraint_column_usage
WHERE table_schema='tww_od'
AND table_name='organisation'
AND column_name='obj_id'
AND constraint_name NOT LIKE'pkey%')ccu
INNER JOIN information_schema.key_column_usage AS kcu
ON ccu.constraint_name = kcu.constraint_name
INNER JOIN information_schema.table_constraints AS tc
ON tc.constraint_name = kcu.constraint_name
LOOP
EXECUTE format($$ UPDATE tww_od.organisation
SET tww_active=TRUE
WHERE obj_id IN (SELECT DISTINCT %I FROM %I.%I)$$, col,schm,tbl);
END LOOP;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
-- function for retrieving default obj_id
CREATE OR REPLACE FUNCTION tww_app.get_default_values(field_name text)
RETURNS varchar(16) AS
$BODY$
DECLARE
myrec record;
BEGIN
BEGIN
SELECT value_obj_id::varchar(16) INTO myrec FROM tww_od.default_values WHERE fieldname = field_name;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE WARNING 'Field name % not found in table tww_od.default_values. Returning NULL',field_name;
RETURN NULL;
END;
RETURN myrec.value_obj_id;
END;
$BODY$
LANGUAGE plpgsql STABLE SECURITY DEFINER
COST 100;
-- Set defaults on all fk_provider,fk_dataowner,fk_owner
CREATE OR REPLACE FUNCTION tww_app.ft_set_default_values()
RETURNS TRIGGER AS
$BODY$
DECLARE
sch text;
tbl text;
col text;
ttp text;
BEGIN
FOR sch,tbl,col,ttp IN
SELECT
t.table_schema,
c.table_name,
c.column_name,
CASE WHEN t.table_type = 'BASE TABLE' then 'TABLE' ELSE t.table_type END
FROM information_schema.columns c
LEFT JOIN information_schema.tables t
ON c.table_name = t.table_name
and c.table_schema = t.table_schema
WHERE c.column_name = NEW.fieldname
and ((c.table_schema ='tww_od'
and t.table_type = 'BASE TABLE')
OR (c.table_schema ='tww_app'
and t.table_type = 'VIEW'))
LOOP
EXECUTE format($$ ALTER %4$s %1$I.%2$I ALTER COLUMN %3$I SET DEFAULT tww_app.get_default_values('%3$s') $$, sch,tbl,col,ttp);
END LOOP;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql SECURITY DEFINER;
CREATE OR REPLACE FUNCTION tww_app.ft_unset_default_values()
RETURNS TRIGGER AS
$BODY$
DECLARE
sch text;
tbl text;
col text;
ttp text;
BEGIN
FOR sch,tbl,col,ttp IN
SELECT
t.table_schema,
c.table_name,
c.column_name,
CASE WHEN t.table_type = 'BASE TABLE' then 'TABLE' ELSE t.table_type END
FROM information_schema.columns c
LEFT JOIN information_schema.tables t
ON c.table_name = t.table_name
and c.table_schema = t.table_schema
WHERE c.column_name = OLD.fieldname
and ((c.table_schema ='tww_od'
and t.table_type = 'BASE TABLE')
OR (c.table_schema ='tww_app'
and t.table_type = 'VIEW'))
LOOP
EXECUTE format($$ ALTER %4$s %1$I.%2$I ALTER COLUMN %3$I DROP DEFAULT $$, sch,tbl,col,ttp);
END LOOP;
RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql SECURITY DEFINER;
DROP TRIGGER IF EXISTS set_default_values ON tww_od.default_values;
CREATE TRIGGER set_default_values
BEFORE INSERT OR UPDATE
ON tww_od.default_values
FOR EACH ROW
EXECUTE PROCEDURE tww_app.ft_set_default_values();
DROP TRIGGER IF EXISTS unset_default_values ON tww_od.default_values;
CREATE TRIGGER unset_default_values
BEFORE DELETE
ON tww_od.default_values
FOR EACH ROW
EXECUTE PROCEDURE tww_app.ft_unset_default_values();