]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/version-upgrade/2.12.5-2.12.6-upgrade-db.sql
LP#1772028 Add some FK violation functions just in case they are missing
[Evergreen.git] / Open-ILS / src / sql / Pg / version-upgrade / 2.12.5-2.12.6-upgrade-db.sql
1 --Upgrade Script for 2.12.5 to 2.12.6
2 \set eg_version '''2.12.6'''
3 BEGIN;
4 INSERT INTO config.upgrade_log (version, applied_to) VALUES ('2.12.6', :eg_version);
5
6 SELECT evergreen.upgrade_deps_block_check('1055', :eg_version);
7
8 CREATE OR REPLACE FUNCTION actor.usr_merge( src_usr INT, dest_usr INT, del_addrs BOOLEAN, del_cards BOOLEAN, deactivate_cards BOOLEAN ) RETURNS VOID AS $$
9 DECLARE
10         suffix TEXT;
11         bucket_row RECORD;
12         picklist_row RECORD;
13         queue_row RECORD;
14         folder_row RECORD;
15 BEGIN
16
17     -- do some initial cleanup 
18     UPDATE actor.usr SET card = NULL WHERE id = src_usr;
19     UPDATE actor.usr SET mailing_address = NULL WHERE id = src_usr;
20     UPDATE actor.usr SET billing_address = NULL WHERE id = src_usr;
21
22     -- actor.*
23     IF del_cards THEN
24         DELETE FROM actor.card where usr = src_usr;
25     ELSE
26         IF deactivate_cards THEN
27             UPDATE actor.card SET active = 'f' WHERE usr = src_usr;
28         END IF;
29         UPDATE actor.card SET usr = dest_usr WHERE usr = src_usr;
30     END IF;
31
32
33     IF del_addrs THEN
34         DELETE FROM actor.usr_address WHERE usr = src_usr;
35     ELSE
36         UPDATE actor.usr_address SET usr = dest_usr WHERE usr = src_usr;
37     END IF;
38
39     UPDATE actor.usr_note SET usr = dest_usr WHERE usr = src_usr;
40     -- dupes are technically OK in actor.usr_standing_penalty, should manually delete them...
41     UPDATE actor.usr_standing_penalty SET usr = dest_usr WHERE usr = src_usr;
42     PERFORM actor.usr_merge_rows('actor.usr_org_unit_opt_in', 'usr', src_usr, dest_usr);
43     PERFORM actor.usr_merge_rows('actor.usr_setting', 'usr', src_usr, dest_usr);
44
45     -- permission.*
46     PERFORM actor.usr_merge_rows('permission.usr_perm_map', 'usr', src_usr, dest_usr);
47     PERFORM actor.usr_merge_rows('permission.usr_object_perm_map', 'usr', src_usr, dest_usr);
48     PERFORM actor.usr_merge_rows('permission.usr_grp_map', 'usr', src_usr, dest_usr);
49     PERFORM actor.usr_merge_rows('permission.usr_work_ou_map', 'usr', src_usr, dest_usr);
50
51
52     -- container.*
53         
54         -- For each *_bucket table: transfer every bucket belonging to src_usr
55         -- into the custody of dest_usr.
56         --
57         -- In order to avoid colliding with an existing bucket owned by
58         -- the destination user, append the source user's id (in parenthesese)
59         -- to the name.  If you still get a collision, add successive
60         -- spaces to the name and keep trying until you succeed.
61         --
62         FOR bucket_row in
63                 SELECT id, name
64                 FROM   container.biblio_record_entry_bucket
65                 WHERE  owner = src_usr
66         LOOP
67                 suffix := ' (' || src_usr || ')';
68                 LOOP
69                         BEGIN
70                                 UPDATE  container.biblio_record_entry_bucket
71                                 SET     owner = dest_usr, name = name || suffix
72                                 WHERE   id = bucket_row.id;
73                         EXCEPTION WHEN unique_violation THEN
74                                 suffix := suffix || ' ';
75                                 CONTINUE;
76                         END;
77                         EXIT;
78                 END LOOP;
79         END LOOP;
80
81         FOR bucket_row in
82                 SELECT id, name
83                 FROM   container.call_number_bucket
84                 WHERE  owner = src_usr
85         LOOP
86                 suffix := ' (' || src_usr || ')';
87                 LOOP
88                         BEGIN
89                                 UPDATE  container.call_number_bucket
90                                 SET     owner = dest_usr, name = name || suffix
91                                 WHERE   id = bucket_row.id;
92                         EXCEPTION WHEN unique_violation THEN
93                                 suffix := suffix || ' ';
94                                 CONTINUE;
95                         END;
96                         EXIT;
97                 END LOOP;
98         END LOOP;
99
100         FOR bucket_row in
101                 SELECT id, name
102                 FROM   container.copy_bucket
103                 WHERE  owner = src_usr
104         LOOP
105                 suffix := ' (' || src_usr || ')';
106                 LOOP
107                         BEGIN
108                                 UPDATE  container.copy_bucket
109                                 SET     owner = dest_usr, name = name || suffix
110                                 WHERE   id = bucket_row.id;
111                         EXCEPTION WHEN unique_violation THEN
112                                 suffix := suffix || ' ';
113                                 CONTINUE;
114                         END;
115                         EXIT;
116                 END LOOP;
117         END LOOP;
118
119         FOR bucket_row in
120                 SELECT id, name
121                 FROM   container.user_bucket
122                 WHERE  owner = src_usr
123         LOOP
124                 suffix := ' (' || src_usr || ')';
125                 LOOP
126                         BEGIN
127                                 UPDATE  container.user_bucket
128                                 SET     owner = dest_usr, name = name || suffix
129                                 WHERE   id = bucket_row.id;
130                         EXCEPTION WHEN unique_violation THEN
131                                 suffix := suffix || ' ';
132                                 CONTINUE;
133                         END;
134                         EXIT;
135                 END LOOP;
136         END LOOP;
137
138         UPDATE container.user_bucket_item SET target_user = dest_usr WHERE target_user = src_usr;
139
140     -- vandelay.*
141         -- transfer queues the same way we transfer buckets (see above)
142         FOR queue_row in
143                 SELECT id, name
144                 FROM   vandelay.queue
145                 WHERE  owner = src_usr
146         LOOP
147                 suffix := ' (' || src_usr || ')';
148                 LOOP
149                         BEGIN
150                                 UPDATE  vandelay.queue
151                                 SET     owner = dest_usr, name = name || suffix
152                                 WHERE   id = queue_row.id;
153                         EXCEPTION WHEN unique_violation THEN
154                                 suffix := suffix || ' ';
155                                 CONTINUE;
156                         END;
157                         EXIT;
158                 END LOOP;
159         END LOOP;
160
161     -- money.*
162     PERFORM actor.usr_merge_rows('money.collections_tracker', 'usr', src_usr, dest_usr);
163     PERFORM actor.usr_merge_rows('money.collections_tracker', 'collector', src_usr, dest_usr);
164     UPDATE money.billable_xact SET usr = dest_usr WHERE usr = src_usr;
165     UPDATE money.billing SET voider = dest_usr WHERE voider = src_usr;
166     UPDATE money.bnm_payment SET accepting_usr = dest_usr WHERE accepting_usr = src_usr;
167
168     -- action.*
169     UPDATE action.circulation SET usr = dest_usr WHERE usr = src_usr;
170     UPDATE action.circulation SET circ_staff = dest_usr WHERE circ_staff = src_usr;
171     UPDATE action.circulation SET checkin_staff = dest_usr WHERE checkin_staff = src_usr;
172     UPDATE action.usr_circ_history SET usr = dest_usr WHERE usr = src_usr;
173
174     UPDATE action.hold_request SET usr = dest_usr WHERE usr = src_usr;
175     UPDATE action.hold_request SET fulfillment_staff = dest_usr WHERE fulfillment_staff = src_usr;
176     UPDATE action.hold_request SET requestor = dest_usr WHERE requestor = src_usr;
177     UPDATE action.hold_notification SET notify_staff = dest_usr WHERE notify_staff = src_usr;
178
179     UPDATE action.in_house_use SET staff = dest_usr WHERE staff = src_usr;
180     UPDATE action.non_cataloged_circulation SET staff = dest_usr WHERE staff = src_usr;
181     UPDATE action.non_cataloged_circulation SET patron = dest_usr WHERE patron = src_usr;
182     UPDATE action.non_cat_in_house_use SET staff = dest_usr WHERE staff = src_usr;
183     UPDATE action.survey_response SET usr = dest_usr WHERE usr = src_usr;
184
185     -- acq.*
186     UPDATE acq.fund_allocation SET allocator = dest_usr WHERE allocator = src_usr;
187         UPDATE acq.fund_transfer SET transfer_user = dest_usr WHERE transfer_user = src_usr;
188
189         -- transfer picklists the same way we transfer buckets (see above)
190         FOR picklist_row in
191                 SELECT id, name
192                 FROM   acq.picklist
193                 WHERE  owner = src_usr
194         LOOP
195                 suffix := ' (' || src_usr || ')';
196                 LOOP
197                         BEGIN
198                                 UPDATE  acq.picklist
199                                 SET     owner = dest_usr, name = name || suffix
200                                 WHERE   id = picklist_row.id;
201                         EXCEPTION WHEN unique_violation THEN
202                                 suffix := suffix || ' ';
203                                 CONTINUE;
204                         END;
205                         EXIT;
206                 END LOOP;
207         END LOOP;
208
209     UPDATE acq.purchase_order SET owner = dest_usr WHERE owner = src_usr;
210     UPDATE acq.po_note SET creator = dest_usr WHERE creator = src_usr;
211     UPDATE acq.po_note SET editor = dest_usr WHERE editor = src_usr;
212     UPDATE acq.provider_note SET creator = dest_usr WHERE creator = src_usr;
213     UPDATE acq.provider_note SET editor = dest_usr WHERE editor = src_usr;
214     UPDATE acq.lineitem_note SET creator = dest_usr WHERE creator = src_usr;
215     UPDATE acq.lineitem_note SET editor = dest_usr WHERE editor = src_usr;
216     UPDATE acq.lineitem_usr_attr_definition SET usr = dest_usr WHERE usr = src_usr;
217
218     -- asset.*
219     UPDATE asset.copy SET creator = dest_usr WHERE creator = src_usr;
220     UPDATE asset.copy SET editor = dest_usr WHERE editor = src_usr;
221     UPDATE asset.copy_note SET creator = dest_usr WHERE creator = src_usr;
222     UPDATE asset.call_number SET creator = dest_usr WHERE creator = src_usr;
223     UPDATE asset.call_number SET editor = dest_usr WHERE editor = src_usr;
224     UPDATE asset.call_number_note SET creator = dest_usr WHERE creator = src_usr;
225
226     -- serial.*
227     UPDATE serial.record_entry SET creator = dest_usr WHERE creator = src_usr;
228     UPDATE serial.record_entry SET editor = dest_usr WHERE editor = src_usr;
229
230     -- reporter.*
231     -- It's not uncommon to define the reporter schema in a replica 
232     -- DB only, so don't assume these tables exist in the write DB.
233     BEGIN
234         UPDATE reporter.template SET owner = dest_usr WHERE owner = src_usr;
235     EXCEPTION WHEN undefined_table THEN
236         -- do nothing
237     END;
238     BEGIN
239         UPDATE reporter.report SET owner = dest_usr WHERE owner = src_usr;
240     EXCEPTION WHEN undefined_table THEN
241         -- do nothing
242     END;
243     BEGIN
244         UPDATE reporter.schedule SET runner = dest_usr WHERE runner = src_usr;
245     EXCEPTION WHEN undefined_table THEN
246         -- do nothing
247     END;
248     BEGIN
249                 -- transfer folders the same way we transfer buckets (see above)
250                 FOR folder_row in
251                         SELECT id, name
252                         FROM   reporter.template_folder
253                         WHERE  owner = src_usr
254                 LOOP
255                         suffix := ' (' || src_usr || ')';
256                         LOOP
257                                 BEGIN
258                                         UPDATE  reporter.template_folder
259                                         SET     owner = dest_usr, name = name || suffix
260                                         WHERE   id = folder_row.id;
261                                 EXCEPTION WHEN unique_violation THEN
262                                         suffix := suffix || ' ';
263                                         CONTINUE;
264                                 END;
265                                 EXIT;
266                         END LOOP;
267                 END LOOP;
268     EXCEPTION WHEN undefined_table THEN
269         -- do nothing
270     END;
271     BEGIN
272                 -- transfer folders the same way we transfer buckets (see above)
273                 FOR folder_row in
274                         SELECT id, name
275                         FROM   reporter.report_folder
276                         WHERE  owner = src_usr
277                 LOOP
278                         suffix := ' (' || src_usr || ')';
279                         LOOP
280                                 BEGIN
281                                         UPDATE  reporter.report_folder
282                                         SET     owner = dest_usr, name = name || suffix
283                                         WHERE   id = folder_row.id;
284                                 EXCEPTION WHEN unique_violation THEN
285                                         suffix := suffix || ' ';
286                                         CONTINUE;
287                                 END;
288                                 EXIT;
289                         END LOOP;
290                 END LOOP;
291     EXCEPTION WHEN undefined_table THEN
292         -- do nothing
293     END;
294     BEGIN
295                 -- transfer folders the same way we transfer buckets (see above)
296                 FOR folder_row in
297                         SELECT id, name
298                         FROM   reporter.output_folder
299                         WHERE  owner = src_usr
300                 LOOP
301                         suffix := ' (' || src_usr || ')';
302                         LOOP
303                                 BEGIN
304                                         UPDATE  reporter.output_folder
305                                         SET     owner = dest_usr, name = name || suffix
306                                         WHERE   id = folder_row.id;
307                                 EXCEPTION WHEN unique_violation THEN
308                                         suffix := suffix || ' ';
309                                         CONTINUE;
310                                 END;
311                                 EXIT;
312                         END LOOP;
313                 END LOOP;
314     EXCEPTION WHEN undefined_table THEN
315         -- do nothing
316     END;
317
318     -- Finally, delete the source user
319     DELETE FROM actor.usr WHERE id = src_usr;
320
321 END;
322 $$ LANGUAGE plpgsql;
323
324
325
326
327 COMMIT;