diff options
-rw-r--r-- | utils/fixme/README | 9 | ||||
-rw-r--r-- | utils/fixme/fixme.pgsql | 63 |
2 files changed, 72 insertions, 0 deletions
diff --git a/utils/fixme/README b/utils/fixme/README new file mode 100644 index 00000000..cce8790d --- /dev/null +++ b/utils/fixme/README @@ -0,0 +1,9 @@ +README for fixme.pgsql + +This utility attempts to move all damaged data into one location so that it +can be sorted out. It creates an account with the number of 1000000000 that +stores the broken transactions. + +It can be run from psql. + +IMPORTANT: BACK UP YOUR DATABASE BEFORE TRYING THIS SCRIPT diff --git a/utils/fixme/fixme.pgsql b/utils/fixme/fixme.pgsql new file mode 100644 index 00000000..7ee23b4d --- /dev/null +++ b/utils/fixme/fixme.pgsql @@ -0,0 +1,63 @@ +begin; + +-- handle NULL chart_id's +insert into chart (accno, description, charttype) values ('1000000000', 'Broken SQL-Ledger Data', 'L'); + +--handle duplicate transaction id's. +CREATE TEMPORARY TABLE id_agregator (id INT, table_name text); + +insert into id_agregator (id, table_name) SELECT id, 'ar' from ar; +insert into id_agregator (id, table_name) SELECT id, 'ap' from ap; +insert into id_agregator (id, table_name) SELECT id, 'business' from business; +insert into id_agregator (id, table_name) SELECT id, 'chart' from chart; +insert into id_agregator (id, table_name) SELECT id, 'customer' from customer; +insert into id_agregator (id, table_name) + SELECT id, 'department' from department; +insert into id_agregator (id, table_name) SELECT id, 'employee' from employee; +insert into id_agregator (id, table_name) SELECT id, 'gl' from gl; +insert into id_agregator (id, table_name) SELECT id, 'oe' from oe; +insert into id_agregator (id, table_name) SELECT id, 'parts' from parts; +insert into id_agregator (id, table_name) + SELECT id, 'partsgroup' from partsgroup; +insert into id_agregator (id, table_name) SELECT id, 'project' from project; +insert into id_agregator (id, table_name) SELECT id, 'vendor' from vendor; +insert into id_agregator (id, table_name) SELECT id, 'warehouse' from warehouse; + +CREATE TEMPORARY VIEW id_view1 AS +SELECT id, count(*) AS num_rows FROM id_agregator +GROUP BY id HAVING num_rows > 1; + +select setval('id', select max(id) + 1 from id_agregator); + +create function fix_dupes() RETURNS OPAQUE AS +' +DECLARE +dupe_id id_agregator%ROWTYPE; +BEGIN +FOR dupe_id IN SELECT id FROM id_agregator + WHERE id IN (SELECT id FROM id_view1) +LOOP + EXECUTE ''UPDATE '' || dupe_id.table_name || + SET id = nextval(''''id'''') WHERE + id = '' ||dupe_id.id; + UPDATE acc_trans SET trans_id = currval(''id'') WHERE + id = '' ||dupe_id.id; + INSERT INTO acc_trans (trans_id, amount, chart_id) VALUES ( + currval(''id''), '1', ( + SELECT id FROM chart WHERE accno = ''1000000000'' + ) + ); + INSERT INTO acc_trans (trans_id, amount, chart_id) VALUES ( + currval(''id''), '-1', ( + SELECT id FROM chart WHERE accno = ''1000000000'' + ) + ); +END; +' LANGUAGE PLPGSQL; + +SELECT fix_dupes (); + +drop function fix_dupes(); + + +commit; |