Projekt

Allgemein

Profil

06 Update Umzug Migration Postgres 13 17 (ab Prodat 2104) » migration-dbupdates.sql

Bereitet im 2. Schritt alles vor, lädt DBUpdates über SQL Funktion etc. - [X] Daniel S, 15.03.2026 14:21

 
1
SELECT TSystem.Settings__Set('ProdatVersion', '25.24.00.00'); -- für DBUpdates Sync
2

    
3

    
4
--DELETE FROM fieldalias;
5
--SELECT tsystem.syncro__fieldalias();
6
--SELECT tsystem.syncro__dbupdates();
7

    
8
DO $do$
9
BEGIN
10

    
11
ALTER TABLE tablefieldinfo ADD COLUMN IF NOT EXISTS foreign_schema varchar(100);
12
ALTER TABLE tablefieldinfo ADD COLUMN IF NOT EXISTS   foreign_table         VARCHAR(100);           -- Die Spalte referenziert auf diese Tabelle ...
13
ALTER TABLE tablefieldinfo ADD COLUMN IF NOT EXISTS   foreign_column        VARCHAR(50);            -- ... und Spalte
14
ALTER TABLE tablefieldinfo ADD COLUMN IF NOT EXISTS   isWritable            BOOLEAN DEFAULT false;
15

    
16
ALTER TABLE recnogroup ADD COLUMN IF NOT EXISTS reg_gruppe_textno      INTEGER;
17
ALTER TABLE recnogroup ADD COLUMN IF NOT EXISTS reg_bez_textno         INTEGER;
18

    
19
ALTER TABLE SettingsDyn ADD COLUMN IF NOT EXISTS sd_deleted      BOOLEAN DEFAULT False;
20

    
21
ALTER TABLE gridlayout ADD COLUMN IF NOT EXISTS gl_default        BOOLEAN NOT NULL DEFAULT true;
22

    
23
ALTER TABLE adk ADD COLUMN IF NOT EXISTS ad_dokversand INTEGER;
24

    
25
ALTER TABLE abzu ADD COLUMN IF NOT EXISTS abz_visible           BOOLEAN NOT NULL DEFAULT TRUE;
26
ALTER TABLE ldsabzu ADD COLUMN IF NOT EXISTS ldaz_visible       BOOLEAN NOT NULL DEFAULT TRUE;
27

    
28

    
29
	BEGIN
30
		CREATE EXTENSION IF NOT EXISTS dblink;
31
    EXCEPTION
32
		WHEN others THEN
33
       		RAISE WARNING '%', SQLERRM;
34
	END; 
35

    
36
	BEGIN
37

    
38
CREATE FUNCTION TSystem.Settings__ENUM__Set(vari VARCHAR, value VARCHAR) RETURNS VOID AS $$
39
  BEGIN
40
    PERFORM TSystem.Settings__Set(vari, TSystem.ENUM_SetValue(TSystem.Settings__Get(vari), value));
41
    RETURN;
42
  END$$LANGUAGE plpgsql;
43
	
44
    EXCEPTION
45
		WHEN others THEN
46
       		RAISE WARNING '%', SQLERRM;
47
	END; 
48

    
49
	BEGIN
50

    
51
CREATE FUNCTION TSystem.Settings__ENUM__Set(vari VARCHAR, value VARCHAR, enabled BOOL) RETURNS VOID AS $$
52
  BEGIN
53
    IF enabled THEN
54
      PERFORM TSystem.Settings__Set(vari, TSystem.ENUM_SetValue(TSystem.Settings__Get(vari), value));
55
    ELSE
56
      PERFORM TSystem.Settings__Set(vari, TSystem.ENUM_DelValue(TSystem.Settings__Get(vari), value));
57
    END IF;
58
    RETURN;
59
  END$$LANGUAGE plpgsql;	
60
	
61
    EXCEPTION
62
		WHEN others THEN
63
       		RAISE WARNING '%', SQLERRM;
64
	END; 
65

    
66
	BEGIN
67

    
68
CREATE FUNCTION TSystem.Settings__Set(vari VARCHAR, inha BOOL) RETURNS VOID AS $$
69
  BEGIN
70
    IF inha IS NULL THEN
71
        PERFORM TSystem.Settings__Delete(vari);
72
        RETURN;
73
    END IF;
74
    IF inha THEN
75
        PERFORM TSystem.Settings__Set(vari, '-1');  -- true
76
    ELSE
77
        PERFORM TSystem.Settings__Set(vari, '0');   -- false
78
    END IF;
79

    
80
    RETURN;
81
  END $$ LANGUAGE plpgsql;	
82
	
83
    EXCEPTION
84
		WHEN others THEN
85
       		RAISE WARNING '%', SQLERRM;
86
	END; 
87

    
88
	BEGIN
89

    
90
-- Setting als VARCHAR setzen
91
CREATE FUNCTION TSystem.Settings__Set(vari VARCHAR, inha VARCHAR) RETURNS VOID AS $$
92
  DECLARE num NUMERIC;
93
  BEGIN
94
    IF inha IS NULL THEN
95
        PERFORM TSystem.Settings__Delete(vari);
96
        RETURN;
97
    END IF;
98
    IF EXISTS(SELECT true FROM public.settings WHERE s_inha = inha AND s_vari = vari) THEN
99
        RETURN;
100
    END IF;
101
    BEGIN
102
        num:= inha::NUMERIC(20,8); -- Cast auf max. Numeric versuchen. Länge entspr. Standard für interne Werte.
103
    EXCEPTION
104
        WHEN OTHERS THEN num:= NULL;
105
    END;
106
    UPDATE settings SET s_inha= inha, s_num_inha= num WHERE s_vari = vari;
107
    IF NOT FOUND THEN
108
        INSERT INTO settings (s_vari, s_inha, s_num_inha) VALUES (vari, inha, num);
109
    END IF;
110

    
111
    RETURN;
112
  END $$ LANGUAGE plpgsql;	
113
	
114
    EXCEPTION
115
		WHEN others THEN
116
       		RAISE WARNING '%', SQLERRM;
117
	END; 
118

    
119
	BEGIN
120
	
121
	
122
DROP FUNCTION IF EXISTS tsystem.settings__gettext(character varying);
123
CREATE FUNCTION TSystem.Settings__GetText(vari varchar, defvalue varchar DEFAULT '')
124
    RETURNS text
125
    AS $$
126
        SELECT coalesce(
127
                    (SELECT s_inha FROM public.settings WHERE s_vari = vari)
128
                    , defvalue
129
               );
130
    $$ LANGUAGE sql PARALLEL SAFE;
131
	
132
    EXCEPTION
133
		WHEN others THEN
134
       		RAISE WARNING '%', SQLERRM;
135
	END; 
136

    
137
	BEGIN
138

    
139
-- Hinweis: Begrenzung von den 8191 Zeichen, im PgDAC, bei vom VARCHAR ohne Längenangabe.
140
CREATE FUNCTION TSystem.Settings__Get(vari varchar)
141
    RETURNS varchar
142
    AS $$
143
        SELECT TSystem.Settings__GetText(vari);
144
    $$LANGUAGE sql PARALLEL SAFE;
145
	
146
    EXCEPTION
147
		WHEN others THEN
148
       		RAISE WARNING '%', SQLERRM;
149
	END; 
150

    
151
	BEGIN
152

    
153
CREATE FUNCTION TSystem.Settings__ENUM__Get(vari varchar, value varchar) RETURNS bool AS $$
154
    BEGIN
155
        RETURN TSystem.ENUM_GetValue(TSystem.Settings__Get(vari), value);
156
    END$$LANGUAGE plpgsql PARALLEL SAFE;
157
	
158
    EXCEPTION
159
		WHEN others THEN
160
       		RAISE WARNING '%', SQLERRM;
161
	END; 
162

    
163
	BEGIN
164

    
165
CREATE FUNCTION TSystem.Settings__ENUM__Get(vari varchar) RETURNS SETOF varchar AS $$
166
    BEGIN
167
        RETURN QUERY SELECT unnest(string_to_array(coalesce(TSystem.Settings__Get(vari), ''), ',')::varchar[]);
168
    END$$LANGUAGE plpgsql PARALLEL SAFE;
169
	
170
    EXCEPTION
171
		WHEN others THEN
172
       		RAISE WARNING '%', SQLERRM;
173
	END; 
174

    
175
	BEGIN
176

    
177
CREATE FUNCTION TSystem.Settings__GetInteger(vari varchar, defvalue integer DEFAULT 0) RETURNS integer AS $$
178
    DECLARE r varchar;
179
    BEGIN
180
        SELECT s_inha INTO r FROM public.settings WHERE s_vari=vari;
181
        IF NOT public.isnumeric(r) THEN --public wegen dump/restore
182
               RETURN defvalue;
183
        END IF;
184

    
185
        RETURN coalesce(CAST(r AS integer), defvalue);
186
    -- ist "parallel unsafe", da es die parallel unsafe Funktion IsNumeric verwendet (#21507)
187
    END $$ LANGUAGE plpgsql; -- TODO ab PG16 auf parallel safe zurück siehe IsNumeric (https://www.postgresql.org/docs/devel/functions-info.html#FUNCTIONS-INFO-VALIDITY)
188

    
189
    EXCEPTION
190
		WHEN others THEN
191
       		RAISE WARNING '%', SQLERRM;
192
	END; 
193

    
194
	BEGIN
195

    
196
CREATE FUNCTION TSystem.Settings__GetNumeric(vari varchar) RETURNS numeric AS $$
197
    DECLARE r numeric;
198
    BEGIN
199
      BEGIN
200
          SELECT coalesce(s_num_inha, s_inha::numeric) INTO r FROM public.settings WHERE s_vari = vari;
201
      EXCEPTION
202
          WHEN OTHERS THEN
203
              BEGIN
204
                  RETURN 0;
205
              END;
206
      END;
207

    
208
      RETURN coalesce(r, 0);
209
    END $$ LANGUAGE plpgsql PARALLEL SAFE;
210
	
211
    EXCEPTION
212
		WHEN others THEN
213
       		RAISE WARNING '%', SQLERRM;
214
	END; 
215

    
216
	BEGIN
217

    
218
CREATE FUNCTION TSystem.Settings__GetBool(vari varchar, defvalue boolean DEFAULT false) RETURNS boolean AS $$
219
    DECLARE r boolean;
220
            s varchar;
221
    BEGIN
222
       SELECT s_inha INTO s FROM public.settings WHERE s_vari = vari;
223
       --
224
       IF NOT FOUND THEN
225
              RETURN defvalue;
226
       END IF;
227
       --
228
       IF UPPER(s) IN ('-1','1', 'T', 'TRUE') THEN
229
              RETURN true;
230
       ELSE
231
              RETURN false;
232
       END IF;
233
    END$$LANGUAGE plpgsql PARALLEL SAFE;
234
	
235
    EXCEPTION
236
		WHEN others THEN
237
       		RAISE WARNING '%', SQLERRM;
238
	END; 
239

    
240
	BEGIN
241

    
242

    
243
	
244
    EXCEPTION
245
		WHEN others THEN
246
       		RAISE WARNING '%', SQLERRM;
247
	END; 
248

    
249
	BEGIN
250

    
251
ALTER TABLE dbupdates ALTER COLUMN upd_bez TYPE  varchar(150);
252
ALTER TABLE dbupdates ADD   COLUMN IF NOT EXISTS upd_donedat   timestamp(0);
253
ALTER TABLE dbupdates ADD   COLUMN IF NOT EXISTS upd_sperr     boolean NOT NULL DEFAULT false;
254

    
255
ALTER TABLE dbupdates ADD   COLUMN IF NOT EXISTS upd_released  boolean NOT NULL DEFAULT true;
256
ALTER TABLE dbupdates ALTER COLUMN               upd_released  				SET DEFAULT false;
257

    
258
    EXCEPTION
259
		WHEN others THEN
260
       		RAISE WARNING '%', SQLERRM;
261
	END; 
262

    
263
	BEGIN
264

    
265
CREATE OR REPLACE FUNCTION tsystem.quote_literal__connstr_param(
266
    IN _text varchar
267
  ) RETURNS varchar AS $$
268
  DECLARE
269
    _result varchar;
270
  BEGIN
271
    _result := REPLACE( REPLACE( _text, E'\\', E'\\\\' ), E'\'', E'\\\'');
272
    _result := concat(  '''',
273
                        _result,
274
                        ''''
275
                      );
276
    RETURN _result;
277
  END; $$ LANGUAGE plpgsql;
278

    
279
    EXCEPTION
280
		WHEN others THEN
281
       		RAISE WARNING '%', SQLERRM;
282
	END; 
283

    
284
	BEGIN
285

    
286
CREATE FUNCTION TSystem.views__all__drop() RETURNS void AS $$
287
  BEGIN
288
    RETURN;
289
  END $$ LANGUAGE plpgsql;
290
  
291
    EXCEPTION
292
		WHEN others THEN
293
       		RAISE WARNING '%', SQLERRM;
294
	END; 
295

    
296
	BEGIN
297

    
298
CREATE FUNCTION TSystem.views__all__create() RETURNS VOID AS $$
299
  BEGIN
300
     RETURN;
301
  END $$ LANGUAGE plpgsql;
302
  
303
    EXCEPTION
304
		WHEN others THEN
305
       		RAISE WARNING '%', SQLERRM;
306
	END; 
307

    
308
	BEGIN
309

    
310
CREATE FUNCTION TSystem.views__Adressen__recreate() RETURNS VOID AS $$
311
    BEGIN
312
	  DROP VIEW IF EXISTS adressen_view CASCADE;
313
	  
314
	  CREATE OR REPLACE VIEW adressen_view AS
315
      SELECT
316
        dbrid,
317
        ad_krz AS adk_ad_krz,
318
        ad_krz,
319
        ad_fa1,
320
        ad_fa2,
321
        ad_adrzus,
322
        ad_anr,
323
        ad_titel,
324
        ad_name,
325
        ad_vorn,
326
        ad_str,
327
        ad_plz,
328
        ad_ort,
329
        ad_landiso::VARCHAR(5),
330
        ad_land,
331
        ad_pfc,
332
        ad_fax,
333
        ad_tel1,
334
        ad_tel2,
335
        ad_email1,
336
        ad_email2,
337
        ad_such,
338
        ad_ustidnr,
339
        ad_branche,
340
        ad_stat,
341
        ad_bem,
342
        adk.modified_date,
343
        ad_auslauf
344
      FROM adk;
345
      RETURN;
346
    END $$ LANGUAGE plpgsql;
347
	
348
    EXCEPTION
349
		WHEN others THEN
350
       		RAISE WARNING '%', SQLERRM;
351
	END; 
352

    
353
	BEGIN
354

    
355
SELECT TSystem.views__Adressen__recreate();	
356

    
357
    EXCEPTION
358
		WHEN others THEN
359
       		RAISE WARNING '%', SQLERRM;
360
	END; 
361

    
362

    
363
	BEGIN
364

    
365
CREATE SCHEMA IF NOT EXISTS tCache;
366

    
367
    EXCEPTION
368
		WHEN others THEN
369
       		RAISE WARNING '%', SQLERRM;
370
	END; 
371

    
372
	BEGIN
373

    
374
 CREATE FUNCTION TCache.CachedViews_Clear() RETURNS BOOLEAN AS $$
375
    DECLARE
376
        r RECORD;
377
        e BOOLEAN;
378
    BEGIN
379
      RETURN false;
380
    END $$ LANGUAGE plpgsql;
381

    
382
    EXCEPTION
383
		WHEN others THEN
384
       		RAISE WARNING '%', SQLERRM;
385
	END; 
386

    
387
	BEGIN
388

    
389
 CREATE FUNCTION table_delete() RETURNS TRIGGER AS $$
390
    BEGIN
391
      RETURN old;
392
    END $$ LANGUAGE plpgsql;	
393

    
394
    EXCEPTION
395
		WHEN others THEN
396
       		RAISE WARNING '%', SQLERRM;
397
	END; 
398

    
399
	BEGIN
400

    
401
CREATE FUNCTION TSystem.views__ReportingAuftg__recreate() RETURNS VOID AS $$
402
BEGIN
403
    DROP VIEW IF EXISTS treporting.auftg_beleg_positionennachtrag;
404
    DROP VIEW IF EXISTS treporting.auftg_beleg_positionen;
405
END $$ LANGUAGE plpgsql;
406

    
407
    EXCEPTION
408
		WHEN others THEN
409
       		RAISE WARNING '%', SQLERRM;
410
	END; 
411

    
412
	BEGIN
413

    
414
CREATE FUNCTION treporting.recreatereportingauftgviews(	)    RETURNS void AS $$
415
BEGIN
416
	RETURN;
417
END $$ LANGUAGE plpgsql;
418

    
419
    EXCEPTION
420
		WHEN others THEN
421
       		RAISE WARNING '%', SQLERRM;
422
	END; 
423

    
424
	BEGIN
425

    
426
CREATE OR REPLACE FUNCTION  treporting.RecreateViews()    RETURNS void AS $$
427
BEGIN
428
	RETURN;
429
END $$ LANGUAGE plpgsql;
430

    
431
    EXCEPTION
432
		WHEN others THEN
433
       		RAISE WARNING '%', SQLERRM;
434
	END; 
435

    
436
	BEGIN
437

    
438
CREATE OR REPLACE FUNCTION  TWawi.RecreateViews()    RETURNS void AS $$
439
BEGIN
440
	RETURN;
441
END $$ LANGUAGE plpgsql;
442

    
443
    EXCEPTION
444
		WHEN others THEN
445
       		RAISE WARNING '%', SQLERRM;
446
	END; 
447

    
448
	BEGIN
449

    
450
CREATE OR REPLACE FUNCTION DropBelegViews() RETURNS VOID AS $$
451
BEGIN
452
  DROP VIEW IF EXISTS eingrech;
453
  DROP VIEW IF EXISTS eingrech_pos;
454
  DROP VIEW IF EXISTS lieferschein;
455
  DROP VIEW IF EXISTS lieferschein_pos;
456
END $$ LANGUAGE plpgsql;
457

    
458
    EXCEPTION
459
		WHEN others THEN
460
       		RAISE WARNING '%', SQLERRM;
461
	END; 
462

    
463
	BEGIN
464

    
465
 CREATE FUNCTION lang_versart(INTEGER, VARCHAR) RETURNS VARCHAR AS $$    -- #7137
466
   BEGIN
467
   RETURN null;
468
  END $$ LANGUAGE plpgsql;
469
  
470
    EXCEPTION
471
		WHEN others THEN
472
       		RAISE WARNING '%', SQLERRM;
473
	END; 
474

    
475
	BEGIN
476

    
477
  -- Value aus einem INI-TEXT auslesen -> [Section] Name=Value
478
  CREATE FUNCTION TSystem.INI_GetValue(ini TEXT, section VARCHAR, name VARCHAR, defvalue VARCHAR DEFAULT NULL) RETURNS VARCHAR AS $$
479
  DECLARE
480
    sectionsinhalt TEXT;
481
    val VARCHAR;
482
  BEGIN
483
    --Inhalt der eingegebenen 'section' ablesen oder 'defvalue' nehmen, wenn nicht gefunden
484
    SELECT trim(substring(ini FROM E'\\[' || section || E'\\]([^\\[]*)'), E'\r\n\t ') INTO sectionsinhalt;
485
    IF sectionsinhalt IS NULL THEN
486
      RETURN defvalue;
487
    END IF;
488
    --Value mit dem 'name' aus der 'section' ablesen oder 'defvalue' nehmen, wenn nicht gefunden
489
    SELECT COALESCE(trim(substring(sectionsinhalt FROM E'[$\r\n]*' || name || E'[ \t]*=[ \t]*([^\r\n$]*)'), E'\r\n\t '), defvalue) INTO val;
490
    RETURN val;
491
  END $$ LANGUAGE plpgsql IMMUTABLE;
492

    
493
    EXCEPTION
494
		WHEN others THEN
495
       		RAISE WARNING '%', SQLERRM;
496
	END; 
497

    
498
	BEGIN
499

    
500
CREATE FUNCTION tsystem.dokutypes__find__by__parentnode_id( _parentnode_id varchar )
501
  RETURNS varchar
502
  AS $$
503
     SELECT null
504
  $$ LANGUAGE sql;  
505

    
506

    
507
    EXCEPTION
508
		WHEN others THEN
509
       		RAISE WARNING '%', SQLERRM;
510
	END; 
511

    
512

    
513
	BEGIN
514

    
515
CREATE FUNCTION tsystem.database__triggers_inaktiv__get(
516
    IN _all_schemas   boolean = false
517
    )
518
    RETURNS TABLE (
519
      tgname          varchar,
520
      src_schemaname  varchar,
521
      src_tablename   varchar,
522
      trg_schemaname  varchar,
523
      trg_tablename   varchar
524
    )
525
    AS $$
526
          -- hinweis: cast as varchar nur in pg kleiner 13?!
527
          SELECT tgname::varchar,
528
                 src_schema.nspname::varchar  AS src_schemaname,
529
                 src_table.relname::varchar   AS src_tablename,
530
                 trg_schema.nspname::varchar  AS trg_schemaname,
531
                 trg_table.relname::varchar   AS trg_tablename
532
            FROM pg_trigger
533
            LEFT JOIN pg_class      AS src_table  ON src_table.oid  = pg_trigger.tgrelid
534
            LEFT JOIN pg_class      AS trg_table  ON trg_table.oid  = pg_trigger.tgconstrrelid
535
            LEFT JOIN pg_namespace  AS src_schema ON src_schema.oid = src_table.relnamespace
536
            LEFT JOIN pg_namespace  AS trg_schema ON trg_schema.oid = trg_table.relnamespace
537
           WHERE tgenabled = 'D'
538
             AND (
539
                  -- Prüfung auf deaktivierte Trigger für alle Schemata
540
                      _all_schemas
541
                  -- Prüfung auf deaktivierte Trigger gilt nicht für folg. Schemata
542
                    -- ignore:    trigger on drop,   fkey: public -> drop, drop -> public, drop -> drop
543
                    -- relevant:  trigger on public, fkey: public -> public
544
                  OR  (
545
                       -- Quelle des deaktivierten Triggers bzw. Contraint-Triggers (fKey) ist nicht in folg. Schemata
546
                           coalesce( src_schema.nspname, '' ) NOT IN ( 'z_99_drop', 'x_950_import', 'x_900_export' )
547
                       -- analog für Ziel des Contraint-Triggers (fKey)
548
                       AND coalesce( trg_schema.nspname, '' ) NOT IN ( 'z_99_drop', 'x_950_import', 'x_900_export' )
549
                      )
550
                 )
551
           ORDER BY tgname
552
    $$ LANGUAGE sql;
553

    
554
	
555
    EXCEPTION
556
		WHEN others THEN
557
       		RAISE WARNING '%', SQLERRM;
558
	END; 
559

    
560

    
561
	BEGIN
562

    
563
CREATE FUNCTION TSystem.triggers__all__disable() RETURNS VOID AS $$
564
  DECLARE r RECORD;
565
  BEGIN
566
    BEGIN
567
      PERFORM TSystem.Settings__Set('triggersdisabled', True);
568
    EXCEPTION WHEN OTHERS THEN
569
      PERFORM TSystem.Settings__Set('triggersdisabled', True);
570
    END;
571
	
572
    FOR r IN
573
      --SELECT DISTINCT schemaname, tablename
574
      --FROM tablefieldinfo
575
      --WHERE schemaname NOT IN ('z_99_drop', 'import')
576
      --  AND tablename NOT IN ('tablefieldinfo')  -- es gibt ein SELECT darauf, drum lässt sich kein ALTER TABLE machen
577
      --  AND NOT isView
578
      SELECT DISTINCT table_schema AS schemaname, table_name AS tablename
579
      FROM information_schema.tables
580
      WHERE table_catalog = current_database()
581
        AND table_type = 'BASE TABLE'
582
        AND table_schema NOT IN ('information_schema', 'pg_catalog', 'z_99_drop', 'import')
583
    LOOP
584
      EXECUTE 'ALTER TABLE ' || quote_ident(r.schemaname) || '.' || quote_ident(r.tablename) || ' DISABLE TRIGGER ALL';
585
    END LOOP;
586
  END $$ LANGUAGE plpgsql;
587

    
588
	
589
    EXCEPTION
590
		WHEN others THEN
591
       		RAISE WARNING '%', SQLERRM;
592
	END; 
593

    
594

    
595
	BEGIN
596

    
597
CREATE FUNCTION TSystem.triggers__all__enable() RETURNS VOID AS $$
598
  DECLARE r RECORD;
599
  BEGIN
600
    FOR r IN  -- aus TFormDBUpdates.Up_EnableTrigger -> lokales CodeSelect
601
      SELECT DISTINCT table_schema AS schemaname, table_name AS tablename
602
      FROM information_schema.tables
603
      WHERE table_catalog = current_database()
604
        AND table_type = 'BASE TABLE'
605
        AND table_schema NOT IN ('information_schema', 'pg_catalog', 'z_99_drop', 'import')
606
    LOOP
607
      EXECUTE 'ALTER TABLE ' || quote_ident(r.schemaname) || '.' || quote_ident(r.tablename) || ' ENABLE TRIGGER ALL';
608
    END LOOP;
609

    
610
    BEGIN
611
      PERFORM TSystem.Settings__Set('triggersdisabled', False);
612
    EXCEPTION WHEN OTHERS THEN
613
      PERFORM TSystem.Settings__Set('triggersdisabled', False);
614
    END;
615
  END $$ LANGUAGE plpgsql;		
616

    
617
	
618
    EXCEPTION
619
		WHEN others THEN
620
       		RAISE WARNING '%', SQLERRM;
621
	END; 
622

    
623

    
624
	BEGIN
625

    
626
    CREATE FUNCTION TSystem.LogDebug(source VARCHAR, message TEXT, category INTEGER DEFAULT 0, context TEXT DEFAULT NULL) RETURNS VOID AS $$
627
      BEGIN
628
        RETURN;
629
      END $$ LANGUAGE plpgsql;
630

    
631
	
632
    EXCEPTION
633
		WHEN others THEN
634
       		RAISE WARNING '%', SQLERRM;
635
	END; 
636

    
637

    
638
	BEGIN
639

    
640

    
641
	
642
    EXCEPTION
643
		WHEN others THEN
644
       		RAISE WARNING '%', SQLERRM;
645
	END; 
646

    
647

    
648
	BEGIN
649

    
650

    
651
	
652
    EXCEPTION
653
		WHEN others THEN
654
       		RAISE WARNING '%', SQLERRM;
655
	END; 
656

    
657

    
658
	BEGIN
659

    
660

    
661
	
662
    EXCEPTION
663
		WHEN others THEN
664
       		RAISE WARNING '%', SQLERRM;
665
	END; 
666

    
667

    
668
	BEGIN
669

    
670

    
671
	
672
    EXCEPTION
673
		WHEN others THEN
674
       		RAISE WARNING '%', SQLERRM;
675
	END; 
676

    
677

    
678
	BEGIN
679
	
680
    EXCEPTION
681
		WHEN others THEN
682
       		RAISE WARNING '%', SQLERRM;
683
	END; 
684

    
685

    
686
	BEGIN
687

    
688
DROP VIEW IF EXISTS TSystem.tablefieldinfo_view;
689
CREATE VIEW TSystem.tablefieldinfo_view AS
690

    
691
  SELECT
692
    -- this filters out composite indicies and duplicated FKs on same columns
693
    DISTINCT ON ( n.nspname, c.relname, a.attnum )
694

    
695
    -- this function is used by the information schema views
696
    -- the bitmask works like this:
697
    --    b'00000100' = deleteable
698
    --    b'00001000' = updateable
699
    --    b'00010000' = insertable
700
    (pg_relation_is_updatable(c.oid::regclass, false)::bit(8) & b'00011100' = b'00011100' ) AS isWritable,
701

    
702
    c.relkind = 'v' AS isview,
703
    n.nspname       AS schemaname,
704
    c.relname       AS tablename,
705
    a.attnum        AS index,
706
    a.attname       AS field,
707

    
708
    -- t.typcategory,
709
    format_type( a.atttypid, null ) AS type,
710

    
711
    -- length only for string types
712
    CASE WHEN
713
        -- S = varchars und chars
714
        t.typcategory IN ( 'S' )
715
      THEN nullif(a.atttypmod,-1) - 4
716
      ELSE null
717
    END
718
    AS length,
719

    
720
    -- adsrc was removed in pg12
721
    pg_get_expr( d.adbin, d.adrelid ) AS "default",
722

    
723
    fn.nspname AS foreign_table_schema,
724
    ft.relname AS foreign_table_name,
725
    fc.attname AS foreign_column_name
726

    
727
  FROM
728
    pg_class                  AS c
729

    
730
    -- schemata
731
    LEFT JOIN pg_namespace    AS n ON
732
          n.oid = c.relnamespace
733

    
734
    -- columns
735
    LEFT JOIN pg_attribute    AS a ON
736
          c.oid = a.attrelid
737

    
738
    -- columntypes
739
    LEFT JOIN pg_type         AS t ON
740
          t.oid = a.atttypid
741

    
742
    -- default values of columns
743
    LEFT JOIN pg_attrdef      AS d ON
744
          d.adrelid = c.oid
745
      AND d.adnum = a.attnum
746

    
747
    -- FKs
748
    LEFT JOIN pg_constraint   AS f ON
749
          f.contype = 'f'             -- foreignkey
750
      AND f.conrelid = c.oid          -- local table
751
      AND array_length ( f.confkey , 1 ) < 2 -- exclude composite keys
752
      AND f.conkey[1] = a.attnum      -- conkey is a array over the attributes ordinal positions
753

    
754
    -- destination of FKs
755
    LEFT JOIN pg_attribute    AS fc ON
756
          f.confrelid  = fc.attrelid -- foreign table
757
      AND f.confkey[1] = fc.attnum
758

    
759
    LEFT JOIN pg_class        AS ft ON
760
          ft.oid = f.confrelid
761

    
762
    LEFT JOIN pg_namespace    AS fn ON
763
          fn.oid = ft.relnamespace
764

    
765
  WHERE
766
    -- only tables and views ( including materialized views )
767
        c.relkind IN ('r','v','m')
768
    -- p = permanent table ( default tables)
769
    -- u = unlogged table ( eg. tlog.auditlog )
770
    -- t = temporary table ( pg_temp_%, create temp table )
771
    AND c.relpersistence IN ('p','u')
772
    -- exclude certain namespaces; they are lowercase by default, except for doubleQuoted Identifier
773
    AND n.nspname NOT IN (
774
         'pg_catalog', 'information_schema', 'tcache', 'tsystem', 'sunext', 'import', 'z_99_drop', 'x_900_export'
775
       )
776
    AND a.attnum > 0
777
    -- they have been deleted anyways by the TSystem.tablefieldinfo__recreate() function
778
    AND a.attname NOT IN ('insert_by', 'modified_by', 'insert_date', 'modified_date')
779
    -- we must omit dropped columns
780
    AND a.attisdropped IS false
781

    
782
  ORDER BY schemaname, tablename, index
783
;
784
--
785
	
786
    EXCEPTION
787
		WHEN others THEN
788
       		RAISE WARNING '%', SQLERRM;
789
	END; 
790

    
791

    
792
	BEGIN
793

    
794
-- Ausgelagert aus Delphi. Ergänzt um Weitergabe der Constraints zugrundeliegender Tabelle an die Views.
795

    
796
CREATE FUNCTION TSystem.tablefieldinfo__recreate(OUT fieldCountBefore INTEGER, OUT fieldCountAfter INTEGER) RETURNS RECORD AS $$
797
  BEGIN
798
    FieldCountBefore := COUNT(*) FROM tablefieldinfo;
799
    -- Einfach alles rauswerfen und neu aufbauen aus den Information-Schema Katalogen.
800
    TRUNCATE tablefieldinfo;
801
    INSERT INTO tablefieldinfo ( isWritable, isView, schemaname, tablename, index, field, type, length, def, foreign_schema, foreign_table, foreign_column)
802
    SELECT * FROM TSystem.TableFieldInfo_view ORDER BY schemaname, tablename, field;
803
    -- View ist Updatable und wird als ChildLink benutzt. Also brauchen wir Defaults und Foreign-Keys.
804
    PERFORM TSystem.CopyConstraintInfo('public', 'oplpm_data', 'public', 'oplpm');
805
    PERFORM TSystem.CopyConstraintInfo('public', 'oplpm_stam', 'public', 'oplpm_data');
806
    -- view dbrid default wert setzen
807
    UPDATE tablefieldinfo SET def = 'nextval(''db_id_seq'')' WHERE isView AND isWritable AND field = 'dbrid';
808
    FieldCountAfter :=  COUNT(*) FROM tablefieldinfo;
809
    --- #18294 Auditlog-Config-FieldList Refresh
810
    --PERFORM tlog.AuditlogConfig_OF__all__recreate();
811
    RETURN;
812
  END $$ LANGUAGE plpgsql VOLATILE;
813

    
814
	
815
    EXCEPTION
816
		WHEN others THEN
817
       		RAISE WARNING '%', SQLERRM;
818
	END; 
819

    
820

    
821
	BEGIN
822

    
823
  CREATE FUNCTION dbupdates__filtered__nodes__upd_ids__get() RETURNS SETOF VARCHAR AS $$
824
      WITH _nodes AS (
825
            SELECT upd_id FROM dbupdates
826
             WHERE upd_donedat >= current_timestamp - '90 days'::INTERVAL
827
                OR upd_donedat IS NULL
828
                OR coalesce(modified_date, insert_date::TIMESTAMP) >= current_timestamp - '90 days'::INTERVAL
829
                OR upd_sperr
830
           ),
831
           _parents AS (
832
            WITH RECURSIVE _tree AS (
833
                  SELECT a.upd_id, a.upd_parent, a.upd_bez, a.upd_donedat, a.modified_date, a.insert_date, a.upd_sperr, 0 AS depth FROM dbupdates a WHERE upd_id IN (SELECT upd_id FROM _nodes)
834
                  UNION
835
                  SELECT a.upd_id, a.upd_parent, a.upd_bez, a.upd_donedat, a.modified_date, a.insert_date, a.upd_sperr, depth - 1 FROM dbupdates a JOIN _tree p ON a.upd_id = p.upd_parent
836
            )
837
            SELECT upd_id FROM _tree
838
             WHERE depth < 0
839
             ORDER BY depth
840
           )
841
           SELECT * FROM _nodes
842
           UNION
843
           SELECT * FROM _parents
844
  $$ LANGUAGE SQL;
845
	
846
    EXCEPTION
847
		WHEN others THEN
848
       		RAISE WARNING '%', SQLERRM;
849
	END; 
850
	
851
	
852
	
853
	
854
	BEGIN
855
	
856
CREATE TYPE tsystem.dblink__connection
857
  AS ENUM (
858
    'default',
859
    'syncro'
860
  );
861

    
862
CREATE OR REPLACE FUNCTION tsystem.dblink__connectionstring__get(_t tsystem.dblink__connection DEFAULT 'default')
863
  RETURNS varchar AS $$
864
  DECLARE result varchar;
865
  BEGIN
866
    CASE _t
867
        WHEN 'default' THEN
868
            result := 'host=localhost port=' || inet_server_port()::integer || ' dbname=' || current_database() || ' user=SYS.dblink password=SYS.dblink';
869
        WHEN 'syncro' THEN
870
            result := 'host=pg.prodat-erp.de port=5432 dbname=PRODAT-18.08 user=syncro password=syncro';
871
        ELSE
872
            RAISE EXCEPTION 'Unknown connection type: %', _t;
873
    END CASE;
874
    RETURN result;
875
  END $$ LANGUAGE plpgsql IMMUTABLE;	
876
	
877
    EXCEPTION
878
		WHEN others THEN
879
       		RAISE WARNING '%', SQLERRM;
880
	END; 	
881
	
882
	
883
	
884
	
885

    
886
	BEGIN
887

    
888
CREATE OR REPLACE FUNCTION tsystem.syncro__dbupdates(IN _dblink VARCHAR DEFAULT tsystem.dblink__connectionstring__get( 'syncro' ) ) RETURNS void AS $$
889
  BEGIN
890
    SET LOCAL SESSION AUTHORIZATION syncro;
891

    
892
    -- NotThisFields: dbrid,upd_donedat
893
    INSERT INTO dbupdates ( upd_id,
894
                            upd_parent,
895
                            upd_minver,
896
                            upd_kunde,
897
                            --upd_donedat,
898
                            upd_bez,
899
                            upd_txt,
900
                            upd_sql,
901
                            upd_projekt,
902
                            upd_noerr,
903
                            upd_sperr,
904
                            upd_released,
905
                            --
906
                            insert_date,
907
                            insert_by,
908
                            modified_by,
909
                            modified_date
910
                          )
911

    
912
    SELECT *
913
      FROM dblink(_dblink,
914
                   'SELECT upd_id,
915
                           upd_parent,
916
                           upd_minver,
917
                           upd_kunde,
918
                           --upd_donedat,
919
                           upd_bez,
920
                           upd_txt,
921
                           upd_sql,
922
                           upd_projekt,
923
                           upd_noerr,
924
                           upd_sperr,
925
                           upd_released,
926
                           --
927
                           insert_date,
928
                           insert_by,
929
                           modified_by,
930
                           modified_date
931
                      FROM dbupdates
932
                     WHERE
933
                            ( upd_kunde IS NULL OR upd_kunde LIKE ' || TSystem.quote_literal__connstr_param( TSystem.Settings__Get( 'KUNDE' ) ) || ' )
934
                          AND upd_minver <= ' || TSystem.quote_literal__connstr_param( TSystem.Settings__Get( 'ProdatVersion' ) ) || '
935
                          AND NOT upd_sperr
936
                          AND     upd_released ')
937
        AS ( _upd_id       varchar(30),
938
             upd_parent    varchar(30),              -- parent (Baumstruktur)
939
             upd_minver    varchar(11),              -- [SYNCRO:Version] Mindest-Programmversion
940
             upd_kunde     varchar(20),              -- [SYNCRO:Kunde]
941
             --upd_donedat timestamp(0),             -- [SYNCRO:NotThisFields] update eingespielt am
942
             upd_bez       varchar(150),
943
             upd_txt       text,
944
             upd_sql       text,
945
             upd_projekt   varchar(100),
946
             upd_noerr     boolean,
947
             upd_sperr     boolean,
948
             upd_released  boolean,
949
             -- System (tables__generate_missing_fields)
950
             insert_date   date,
951
             insert_by     varchar(32),
952
             modified_by   varchar(32),
953
             modified_date timestamp(0)               -- [SYNCRO:Modified]
954
           )
955
     WHERE NOT EXISTS( SELECT true FROM dbupdates WHERE upd_id = _upd_id );
956
    ---
957

    
958
    RAISE NOTICE 'dbupdates %', (SELECT count(*) FROM dbupdates);
959
  END $$ LANGUAGE plpgsql;
960
	
961
    EXCEPTION
962
		WHEN others THEN
963
       		RAISE WARNING '%', SQLERRM;
964
	END; 
965

    
966
	BEGIN
967

    
968
PERFORM tsystem.syncro__dbupdates();
969
	
970
    EXCEPTION
971
		WHEN others THEN
972
       		RAISE WARNING '%', SQLERRM;
973
	END; 
974

    
975

    
976
END $do$ LANGUAGE plpgsql;
(3-3/3)