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, 30.03.2026 14:52

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

    
3

    
4
CREATE OR REPLACE FUNCTION TSystem.currentuser()
5
RETURNS varchar AS $$
6
   SELECT current_user::varchar
7
$$ LANGUAGE sql STABLE;
8

    
9
CREATE OR REPLACE FUNCTION TSystem.current_user()
10
RETURNS varchar AS $$
11
   SELECT current_user::varchar
12
$$ LANGUAGE sql STABLE;
13

    
14
DROP FUNCTION IF EXISTS prodat_languages.lang_text(integer, integer);
15

    
16
CREATE OR REPLACE FUNCTION prodat_languages.lang_text(integer, varchar) RETURNS varchar
17
  AS $$
18
     --WITH bringt nix, langsamer
19
     SELECT coalesce(
20
       (
21
          SELECT
22
            coalesce(CASE _curr_lang
23
                          WHEN 'D'  THEN coalesce(t_kundtxt0, t_feld0, t_kundtxt0, t_feld0)
24
                          WHEN 'F'  THEN coalesce(t_kundtxt1, t_feld1, t_kundtxt0, t_feld0)
25
                          WHEN 'EN' THEN coalesce(t_kundtxt3, t_feld3, t_kundtxt0, t_feld0)
26
                          WHEN 'IT' THEN coalesce(t_kundtxt4, t_feld4, t_kundtxt0, t_feld0)
27
                          WHEN 'ES' THEN coalesce(t_kundtxt5, t_feld5, t_kundtxt0, t_feld0)
28
                          WHEN 'CZ' THEN coalesce(t_kundtxt6, t_feld6, t_kundtxt0, t_feld0)
29
                          WHEN 'RU' THEN coalesce(t_kundtxt7, t_feld7, t_kundtxt0, t_feld0)
30
                     ELSE
31
                          coalesce(t_kundtxt0, t_feld0)
32
                     END
33
                     ,
34
                     $2
35
            )
36
          FROM public.text0
37
          LEFT JOIN LATERAL (SELECT s_inha FROM public.settings WHERE s_vari = 'LangMenu:' || TSystem.current_user() ) AS user_lang ON true
38
          LEFT JOIN LATERAL (SELECT s_inha FROM public.settings WHERE s_vari = 'Lang') AS main_lang ON true
39

    
40
          LEFT JOIN LATERAL (SELECT coalesce((SELECT s_spr_key FROM public.adkspco WHERE s_spco = user_lang.s_inha),
41
                                              main_lang.s_inha
42
                                             ) AS _curr_lang
43
                            ) AS lang ON true
44
          WHERE t_nr = $1
45
       )
46
     , $2
47
     )
48
  $$ LANGUAGE sql STABLE PARALLEL SAFE;
49

    
50

    
51
--DELETE FROM fieldalias;
52
--SELECT tsystem.syncro__fieldalias();
53
--SELECT tsystem.syncro__dbupdates();
54

    
55
DO $do$
56
BEGIN
57

    
58
ALTER TABLE tablefieldinfo ADD COLUMN IF NOT EXISTS foreign_schema varchar(100);
59
ALTER TABLE tablefieldinfo ADD COLUMN IF NOT EXISTS   foreign_table         VARCHAR(100);           -- Die Spalte referenziert auf diese Tabelle ...
60
ALTER TABLE tablefieldinfo ADD COLUMN IF NOT EXISTS   foreign_column        VARCHAR(50);            -- ... und Spalte
61
ALTER TABLE tablefieldinfo ADD COLUMN IF NOT EXISTS   isWritable            BOOLEAN DEFAULT false;
62

    
63
ALTER TABLE recnogroup ADD COLUMN IF NOT EXISTS reg_gruppe_textno      INTEGER;
64
ALTER TABLE recnogroup ADD COLUMN IF NOT EXISTS reg_bez_textno         INTEGER;
65

    
66
ALTER TABLE SettingsDyn ADD COLUMN IF NOT EXISTS sd_deleted      BOOLEAN DEFAULT False;
67

    
68
ALTER TABLE gridlayout ADD COLUMN IF NOT EXISTS gl_default        BOOLEAN NOT NULL DEFAULT true;
69

    
70
ALTER TABLE adk ADD COLUMN IF NOT EXISTS ad_dokversand INTEGER;
71

    
72
ALTER TABLE abzu ADD COLUMN IF NOT EXISTS abz_visible           BOOLEAN NOT NULL DEFAULT TRUE;
73
ALTER TABLE ldsabzu ADD COLUMN IF NOT EXISTS ldaz_visible       BOOLEAN NOT NULL DEFAULT TRUE;
74

    
75

    
76
	BEGIN
77
		CREATE EXTENSION IF NOT EXISTS dblink;
78
    EXCEPTION
79
		WHEN others THEN
80
       		RAISE WARNING '%', SQLERRM;
81
	END; 
82

    
83
	BEGIN
84

    
85
CREATE FUNCTION TSystem.Settings__ENUM__Set(vari VARCHAR, value VARCHAR) RETURNS VOID AS $$
86
  BEGIN
87
    PERFORM TSystem.Settings__Set(vari, TSystem.ENUM_SetValue(TSystem.Settings__Get(vari), value));
88
    RETURN;
89
  END$$LANGUAGE plpgsql;
90
	
91
    EXCEPTION
92
		WHEN others THEN
93
       		RAISE WARNING '%', SQLERRM;
94
	END; 
95

    
96
	BEGIN
97

    
98
CREATE FUNCTION TSystem.Settings__ENUM__Set(vari VARCHAR, value VARCHAR, enabled BOOL) RETURNS VOID AS $$
99
  BEGIN
100
    IF enabled THEN
101
      PERFORM TSystem.Settings__Set(vari, TSystem.ENUM_SetValue(TSystem.Settings__Get(vari), value));
102
    ELSE
103
      PERFORM TSystem.Settings__Set(vari, TSystem.ENUM_DelValue(TSystem.Settings__Get(vari), value));
104
    END IF;
105
    RETURN;
106
  END$$LANGUAGE plpgsql;	
107
	
108
    EXCEPTION
109
		WHEN others THEN
110
       		RAISE WARNING '%', SQLERRM;
111
	END; 
112

    
113
	BEGIN
114

    
115
CREATE FUNCTION TSystem.Settings__Set(vari VARCHAR, inha BOOL) RETURNS VOID AS $$
116
  BEGIN
117
    IF inha IS NULL THEN
118
        PERFORM TSystem.Settings__Delete(vari);
119
        RETURN;
120
    END IF;
121
    IF inha THEN
122
        PERFORM TSystem.Settings__Set(vari, '-1');  -- true
123
    ELSE
124
        PERFORM TSystem.Settings__Set(vari, '0');   -- false
125
    END IF;
126

    
127
    RETURN;
128
  END $$ LANGUAGE plpgsql;	
129
	
130
    EXCEPTION
131
		WHEN others THEN
132
       		RAISE WARNING '%', SQLERRM;
133
	END; 
134

    
135
	BEGIN
136

    
137
-- Setting als VARCHAR setzen
138
CREATE FUNCTION TSystem.Settings__Set(vari VARCHAR, inha VARCHAR) RETURNS VOID AS $$
139
  DECLARE num NUMERIC;
140
  BEGIN
141
    IF inha IS NULL THEN
142
        PERFORM TSystem.Settings__Delete(vari);
143
        RETURN;
144
    END IF;
145
    IF EXISTS(SELECT true FROM public.settings WHERE s_inha = inha AND s_vari = vari) THEN
146
        RETURN;
147
    END IF;
148
    BEGIN
149
        num:= inha::NUMERIC(20,8); -- Cast auf max. Numeric versuchen. Länge entspr. Standard für interne Werte.
150
    EXCEPTION
151
        WHEN OTHERS THEN num:= NULL;
152
    END;
153
    UPDATE settings SET s_inha= inha, s_num_inha= num WHERE s_vari = vari;
154
    IF NOT FOUND THEN
155
        INSERT INTO settings (s_vari, s_inha, s_num_inha) VALUES (vari, inha, num);
156
    END IF;
157

    
158
    RETURN;
159
  END $$ LANGUAGE plpgsql;	
160
	
161
    EXCEPTION
162
		WHEN others THEN
163
       		RAISE WARNING '%', SQLERRM;
164
	END; 
165

    
166
	BEGIN
167
	
168
	
169
DROP FUNCTION IF EXISTS tsystem.settings__gettext(character varying);
170
CREATE FUNCTION TSystem.Settings__GetText(vari varchar, defvalue varchar DEFAULT '')
171
    RETURNS text
172
    AS $$
173
        SELECT coalesce(
174
                    (SELECT s_inha FROM public.settings WHERE s_vari = vari)
175
                    , defvalue
176
               );
177
    $$ LANGUAGE sql PARALLEL SAFE;
178
	
179
    EXCEPTION
180
		WHEN others THEN
181
       		RAISE WARNING '%', SQLERRM;
182
	END; 
183

    
184
	BEGIN
185

    
186
-- Hinweis: Begrenzung von den 8191 Zeichen, im PgDAC, bei vom VARCHAR ohne Längenangabe.
187
CREATE FUNCTION TSystem.Settings__Get(vari varchar)
188
    RETURNS varchar
189
    AS $$
190
        SELECT TSystem.Settings__GetText(vari);
191
    $$LANGUAGE sql PARALLEL SAFE;
192
	
193
    EXCEPTION
194
		WHEN others THEN
195
       		RAISE WARNING '%', SQLERRM;
196
	END; 
197

    
198
	BEGIN
199

    
200
CREATE FUNCTION TSystem.Settings__ENUM__Get(vari varchar, value varchar) RETURNS bool AS $$
201
    BEGIN
202
        RETURN TSystem.ENUM_GetValue(TSystem.Settings__Get(vari), value);
203
    END$$LANGUAGE plpgsql PARALLEL SAFE;
204
	
205
    EXCEPTION
206
		WHEN others THEN
207
       		RAISE WARNING '%', SQLERRM;
208
	END; 
209

    
210
	BEGIN
211

    
212
CREATE FUNCTION TSystem.Settings__ENUM__Get(vari varchar) RETURNS SETOF varchar AS $$
213
    BEGIN
214
        RETURN QUERY SELECT unnest(string_to_array(coalesce(TSystem.Settings__Get(vari), ''), ',')::varchar[]);
215
    END$$LANGUAGE plpgsql PARALLEL SAFE;
216
	
217
    EXCEPTION
218
		WHEN others THEN
219
       		RAISE WARNING '%', SQLERRM;
220
	END; 
221

    
222
	BEGIN
223

    
224
CREATE FUNCTION TSystem.Settings__GetInteger(vari varchar, defvalue integer DEFAULT 0) RETURNS integer AS $$
225
    DECLARE r varchar;
226
    BEGIN
227
        SELECT s_inha INTO r FROM public.settings WHERE s_vari=vari;
228
        IF NOT public.isnumeric(r) THEN --public wegen dump/restore
229
               RETURN defvalue;
230
        END IF;
231

    
232
        RETURN coalesce(CAST(r AS integer), defvalue);
233
    -- ist "parallel unsafe", da es die parallel unsafe Funktion IsNumeric verwendet (#21507)
234
    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)
235

    
236
    EXCEPTION
237
		WHEN others THEN
238
       		RAISE WARNING '%', SQLERRM;
239
	END; 
240

    
241
	BEGIN
242

    
243
CREATE FUNCTION TSystem.Settings__GetNumeric(vari varchar) RETURNS numeric AS $$
244
    DECLARE r numeric;
245
    BEGIN
246
      BEGIN
247
          SELECT coalesce(s_num_inha, s_inha::numeric) INTO r FROM public.settings WHERE s_vari = vari;
248
      EXCEPTION
249
          WHEN OTHERS THEN
250
              BEGIN
251
                  RETURN 0;
252
              END;
253
      END;
254

    
255
      RETURN coalesce(r, 0);
256
    END $$ LANGUAGE plpgsql PARALLEL SAFE;
257
	
258
    EXCEPTION
259
		WHEN others THEN
260
       		RAISE WARNING '%', SQLERRM;
261
	END; 
262

    
263
	BEGIN
264

    
265
CREATE FUNCTION TSystem.Settings__GetBool(vari varchar, defvalue boolean DEFAULT false) RETURNS boolean AS $$
266
    DECLARE r boolean;
267
            s varchar;
268
    BEGIN
269
       SELECT s_inha INTO s FROM public.settings WHERE s_vari = vari;
270
       --
271
       IF NOT FOUND THEN
272
              RETURN defvalue;
273
       END IF;
274
       --
275
       IF UPPER(s) IN ('-1','1', 'T', 'TRUE') THEN
276
              RETURN true;
277
       ELSE
278
              RETURN false;
279
       END IF;
280
    END$$LANGUAGE plpgsql PARALLEL SAFE;
281
	
282
    EXCEPTION
283
		WHEN others THEN
284
       		RAISE WARNING '%', SQLERRM;
285
	END; 
286

    
287
	BEGIN
288

    
289

    
290
	
291
    EXCEPTION
292
		WHEN others THEN
293
       		RAISE WARNING '%', SQLERRM;
294
	END; 
295

    
296
	BEGIN
297

    
298
ALTER TABLE dbupdates ALTER COLUMN upd_bez TYPE  varchar(150);
299
ALTER TABLE dbupdates ADD   COLUMN IF NOT EXISTS upd_donedat   timestamp(0);
300
ALTER TABLE dbupdates ADD   COLUMN IF NOT EXISTS upd_sperr     boolean NOT NULL DEFAULT false;
301

    
302
ALTER TABLE dbupdates ADD   COLUMN IF NOT EXISTS upd_released  boolean NOT NULL DEFAULT true;
303
ALTER TABLE dbupdates ALTER COLUMN               upd_released  				SET DEFAULT false;
304
ALTER TABLE dbupdates ADD COLUMN IF NOT EXISTS upd_released_dat timestamp(0);
305

    
306
UPDATE dbupdates SET upd_released_dat = '2000-01-01' WHERE upd_released AND upd_released_dat IS null;
307

    
308

    
309

    
310
    EXCEPTION
311
		WHEN others THEN
312
       		RAISE WARNING '%', SQLERRM;
313
	END; 
314

    
315
	BEGIN
316

    
317
CREATE OR REPLACE FUNCTION tsystem.quote_literal__connstr_param(
318
    IN _text varchar
319
  ) RETURNS varchar AS $$
320
  DECLARE
321
    _result varchar;
322
  BEGIN
323
    _result := REPLACE( REPLACE( _text, E'\\', E'\\\\' ), E'\'', E'\\\'');
324
    _result := concat(  '''',
325
                        _result,
326
                        ''''
327
                      );
328
    RETURN _result;
329
  END; $$ LANGUAGE plpgsql;
330

    
331
    EXCEPTION
332
		WHEN others THEN
333
       		RAISE WARNING '%', SQLERRM;
334
	END; 
335

    
336
	BEGIN
337

    
338
CREATE FUNCTION TSystem.views__all__drop() RETURNS void AS $$
339
  BEGIN
340
    RETURN;
341
  END $$ LANGUAGE plpgsql;
342
  
343
    EXCEPTION
344
		WHEN others THEN
345
       		RAISE WARNING '%', SQLERRM;
346
	END; 
347

    
348
	BEGIN
349

    
350
CREATE FUNCTION TSystem.views__all__create() RETURNS VOID AS $$
351
  BEGIN
352
     RETURN;
353
  END $$ LANGUAGE plpgsql;
354
  
355
    EXCEPTION
356
		WHEN others THEN
357
       		RAISE WARNING '%', SQLERRM;
358
	END; 
359

    
360
	BEGIN
361

    
362
CREATE FUNCTION TSystem.views__Adressen__recreate() RETURNS VOID AS $$
363
    BEGIN
364
	  DROP VIEW IF EXISTS adressen_view CASCADE;
365
	  
366
	  CREATE OR REPLACE VIEW adressen_view AS
367
      SELECT
368
        dbrid,
369
        ad_krz AS adk_ad_krz,
370
        ad_krz,
371
        ad_fa1,
372
        ad_fa2,
373
        ad_adrzus,
374
        ad_anr,
375
        ad_titel,
376
        ad_name,
377
        ad_vorn,
378
        ad_str,
379
        ad_plz,
380
        ad_ort,
381
        ad_landiso::VARCHAR(5),
382
        ad_land,
383
        ad_pfc,
384
        ad_fax,
385
        ad_tel1,
386
        ad_tel2,
387
        ad_email1,
388
        ad_email2,
389
        ad_such,
390
        ad_ustidnr,
391
        ad_branche,
392
        ad_stat,
393
        ad_bem,
394
        adk.modified_date,
395
        ad_auslauf
396
      FROM adk;
397
      RETURN;
398
    END $$ LANGUAGE plpgsql;
399
	
400
    EXCEPTION
401
		WHEN others THEN
402
       		RAISE WARNING '%', SQLERRM;
403
	END; 
404

    
405
	BEGIN
406

    
407
SELECT TSystem.views__Adressen__recreate();	
408

    
409
    EXCEPTION
410
		WHEN others THEN
411
       		RAISE WARNING '%', SQLERRM;
412
	END; 
413

    
414

    
415
	BEGIN
416

    
417
CREATE SCHEMA IF NOT EXISTS tCache;
418

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

    
424
	BEGIN
425

    
426
 CREATE FUNCTION TCache.CachedViews_Clear() RETURNS BOOLEAN AS $$
427
    DECLARE
428
        r RECORD;
429
        e BOOLEAN;
430
    BEGIN
431
      RETURN false;
432
    END $$ LANGUAGE plpgsql;
433

    
434
    EXCEPTION
435
		WHEN others THEN
436
       		RAISE WARNING '%', SQLERRM;
437
	END; 
438

    
439
	BEGIN
440

    
441
 CREATE FUNCTION table_delete() RETURNS TRIGGER AS $$
442
    BEGIN
443
      RETURN old;
444
    END $$ LANGUAGE plpgsql;	
445

    
446
    EXCEPTION
447
		WHEN others THEN
448
       		RAISE WARNING '%', SQLERRM;
449
	END; 
450

    
451
	BEGIN
452

    
453
CREATE FUNCTION TSystem.views__ReportingAuftg__recreate() RETURNS VOID AS $$
454
BEGIN
455
    DROP VIEW IF EXISTS treporting.auftg_beleg_positionennachtrag;
456
    DROP VIEW IF EXISTS treporting.auftg_beleg_positionen;
457
END $$ LANGUAGE plpgsql;
458

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

    
464
	BEGIN
465

    
466
CREATE FUNCTION treporting.recreatereportingauftgviews(	)    RETURNS void AS $$
467
BEGIN
468
	RETURN;
469
END $$ LANGUAGE plpgsql;
470

    
471
    EXCEPTION
472
		WHEN others THEN
473
       		RAISE WARNING '%', SQLERRM;
474
	END; 
475

    
476
	BEGIN
477

    
478
CREATE OR REPLACE FUNCTION  treporting.RecreateViews()    RETURNS void AS $$
479
BEGIN
480
	RETURN;
481
END $$ LANGUAGE plpgsql;
482

    
483
    EXCEPTION
484
		WHEN others THEN
485
       		RAISE WARNING '%', SQLERRM;
486
	END; 
487

    
488
	BEGIN
489

    
490
CREATE OR REPLACE FUNCTION  TWawi.RecreateViews()    RETURNS void AS $$
491
BEGIN
492
	RETURN;
493
END $$ LANGUAGE plpgsql;
494

    
495
    EXCEPTION
496
		WHEN others THEN
497
       		RAISE WARNING '%', SQLERRM;
498
	END; 
499

    
500
	BEGIN
501

    
502
CREATE OR REPLACE FUNCTION DropBelegViews() RETURNS VOID AS $$
503
BEGIN
504
  DROP VIEW IF EXISTS eingrech;
505
  DROP VIEW IF EXISTS eingrech_pos;
506
  DROP VIEW IF EXISTS lieferschein;
507
  DROP VIEW IF EXISTS lieferschein_pos;
508
END $$ LANGUAGE plpgsql;
509

    
510
    EXCEPTION
511
		WHEN others THEN
512
       		RAISE WARNING '%', SQLERRM;
513
	END; 
514

    
515
	BEGIN
516

    
517
 CREATE FUNCTION lang_versart(INTEGER, VARCHAR) RETURNS VARCHAR AS $$    -- #7137
518
   BEGIN
519
   RETURN null;
520
  END $$ LANGUAGE plpgsql;
521
  
522
    EXCEPTION
523
		WHEN others THEN
524
       		RAISE WARNING '%', SQLERRM;
525
	END; 
526

    
527
	BEGIN
528

    
529
  -- Value aus einem INI-TEXT auslesen -> [Section] Name=Value
530
  CREATE FUNCTION TSystem.INI_GetValue(ini TEXT, section VARCHAR, name VARCHAR, defvalue VARCHAR DEFAULT NULL) RETURNS VARCHAR AS $$
531
  DECLARE
532
    sectionsinhalt TEXT;
533
    val VARCHAR;
534
  BEGIN
535
    --Inhalt der eingegebenen 'section' ablesen oder 'defvalue' nehmen, wenn nicht gefunden
536
    SELECT trim(substring(ini FROM E'\\[' || section || E'\\]([^\\[]*)'), E'\r\n\t ') INTO sectionsinhalt;
537
    IF sectionsinhalt IS NULL THEN
538
      RETURN defvalue;
539
    END IF;
540
    --Value mit dem 'name' aus der 'section' ablesen oder 'defvalue' nehmen, wenn nicht gefunden
541
    SELECT COALESCE(trim(substring(sectionsinhalt FROM E'[$\r\n]*' || name || E'[ \t]*=[ \t]*([^\r\n$]*)'), E'\r\n\t '), defvalue) INTO val;
542
    RETURN val;
543
  END $$ LANGUAGE plpgsql IMMUTABLE;
544

    
545
    EXCEPTION
546
		WHEN others THEN
547
       		RAISE WARNING '%', SQLERRM;
548
	END; 
549

    
550
	BEGIN
551

    
552
CREATE FUNCTION tsystem.dokutypes__find__by__parentnode_id( _parentnode_id varchar )
553
  RETURNS varchar
554
  AS $$
555
     SELECT null
556
  $$ LANGUAGE sql;  
557

    
558

    
559
    EXCEPTION
560
		WHEN others THEN
561
       		RAISE WARNING '%', SQLERRM;
562
	END; 
563

    
564

    
565
	BEGIN
566

    
567
CREATE FUNCTION tsystem.database__triggers_inaktiv__get(
568
    IN _all_schemas   boolean = false
569
    )
570
    RETURNS TABLE (
571
      tgname          varchar,
572
      src_schemaname  varchar,
573
      src_tablename   varchar,
574
      trg_schemaname  varchar,
575
      trg_tablename   varchar
576
    )
577
    AS $$
578
          -- hinweis: cast as varchar nur in pg kleiner 13?!
579
          SELECT tgname::varchar,
580
                 src_schema.nspname::varchar  AS src_schemaname,
581
                 src_table.relname::varchar   AS src_tablename,
582
                 trg_schema.nspname::varchar  AS trg_schemaname,
583
                 trg_table.relname::varchar   AS trg_tablename
584
            FROM pg_trigger
585
            LEFT JOIN pg_class      AS src_table  ON src_table.oid  = pg_trigger.tgrelid
586
            LEFT JOIN pg_class      AS trg_table  ON trg_table.oid  = pg_trigger.tgconstrrelid
587
            LEFT JOIN pg_namespace  AS src_schema ON src_schema.oid = src_table.relnamespace
588
            LEFT JOIN pg_namespace  AS trg_schema ON trg_schema.oid = trg_table.relnamespace
589
           WHERE tgenabled = 'D'
590
             AND (
591
                  -- Prüfung auf deaktivierte Trigger für alle Schemata
592
                      _all_schemas
593
                  -- Prüfung auf deaktivierte Trigger gilt nicht für folg. Schemata
594
                    -- ignore:    trigger on drop,   fkey: public -> drop, drop -> public, drop -> drop
595
                    -- relevant:  trigger on public, fkey: public -> public
596
                  OR  (
597
                       -- Quelle des deaktivierten Triggers bzw. Contraint-Triggers (fKey) ist nicht in folg. Schemata
598
                           coalesce( src_schema.nspname, '' ) NOT IN ( 'z_99_drop', 'x_950_import', 'x_900_export' )
599
                       -- analog für Ziel des Contraint-Triggers (fKey)
600
                       AND coalesce( trg_schema.nspname, '' ) NOT IN ( 'z_99_drop', 'x_950_import', 'x_900_export' )
601
                      )
602
                 )
603
           ORDER BY tgname
604
    $$ LANGUAGE sql;
605

    
606
	
607
    EXCEPTION
608
		WHEN others THEN
609
       		RAISE WARNING '%', SQLERRM;
610
	END; 
611

    
612

    
613
	BEGIN
614

    
615
CREATE FUNCTION TSystem.triggers__all__disable() RETURNS VOID AS $$
616
  DECLARE r RECORD;
617
  BEGIN
618
    BEGIN
619
      PERFORM TSystem.Settings__Set('triggersdisabled', True);
620
    EXCEPTION WHEN OTHERS THEN
621
      PERFORM TSystem.Settings__Set('triggersdisabled', True);
622
    END;
623
	
624
    FOR r IN
625
      --SELECT DISTINCT schemaname, tablename
626
      --FROM tablefieldinfo
627
      --WHERE schemaname NOT IN ('z_99_drop', 'import')
628
      --  AND tablename NOT IN ('tablefieldinfo')  -- es gibt ein SELECT darauf, drum lässt sich kein ALTER TABLE machen
629
      --  AND NOT isView
630
      SELECT DISTINCT table_schema AS schemaname, table_name AS tablename
631
      FROM information_schema.tables
632
      WHERE table_catalog = current_database()
633
        AND table_type = 'BASE TABLE'
634
        AND table_schema NOT IN ('information_schema', 'pg_catalog', 'z_99_drop', 'import')
635
    LOOP
636
      EXECUTE 'ALTER TABLE ' || quote_ident(r.schemaname) || '.' || quote_ident(r.tablename) || ' DISABLE TRIGGER ALL';
637
    END LOOP;
638
  END $$ LANGUAGE plpgsql;
639

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

    
646

    
647
	BEGIN
648

    
649
CREATE FUNCTION TSystem.triggers__all__enable() RETURNS VOID AS $$
650
  DECLARE r RECORD;
651
  BEGIN
652
    FOR r IN  -- aus TFormDBUpdates.Up_EnableTrigger -> lokales CodeSelect
653
      SELECT DISTINCT table_schema AS schemaname, table_name AS tablename
654
      FROM information_schema.tables
655
      WHERE table_catalog = current_database()
656
        AND table_type = 'BASE TABLE'
657
        AND table_schema NOT IN ('information_schema', 'pg_catalog', 'z_99_drop', 'import')
658
    LOOP
659
      EXECUTE 'ALTER TABLE ' || quote_ident(r.schemaname) || '.' || quote_ident(r.tablename) || ' ENABLE TRIGGER ALL';
660
    END LOOP;
661

    
662
    BEGIN
663
      PERFORM TSystem.Settings__Set('triggersdisabled', False);
664
    EXCEPTION WHEN OTHERS THEN
665
      PERFORM TSystem.Settings__Set('triggersdisabled', False);
666
    END;
667
  END $$ LANGUAGE plpgsql;		
668

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

    
675

    
676
	BEGIN
677

    
678
    CREATE FUNCTION TSystem.LogDebug(source VARCHAR, message TEXT, category INTEGER DEFAULT 0, context TEXT DEFAULT NULL) RETURNS VOID AS $$
679
      BEGIN
680
        RETURN;
681
      END $$ LANGUAGE plpgsql;
682

    
683
	
684
    EXCEPTION
685
		WHEN others THEN
686
       		RAISE WARNING '%', SQLERRM;
687
	END; 
688

    
689

    
690
	BEGIN
691

    
692

    
693
	
694
    EXCEPTION
695
		WHEN others THEN
696
       		RAISE WARNING '%', SQLERRM;
697
	END; 
698

    
699

    
700
	BEGIN
701

    
702

    
703
	
704
    EXCEPTION
705
		WHEN others THEN
706
       		RAISE WARNING '%', SQLERRM;
707
	END; 
708

    
709

    
710
	BEGIN
711

    
712

    
713
	
714
    EXCEPTION
715
		WHEN others THEN
716
       		RAISE WARNING '%', SQLERRM;
717
	END; 
718

    
719

    
720
	BEGIN
721

    
722

    
723
	
724
    EXCEPTION
725
		WHEN others THEN
726
       		RAISE WARNING '%', SQLERRM;
727
	END; 
728

    
729

    
730
	BEGIN
731
	
732
    EXCEPTION
733
		WHEN others THEN
734
       		RAISE WARNING '%', SQLERRM;
735
	END; 
736

    
737

    
738
	BEGIN
739

    
740
DROP VIEW IF EXISTS TSystem.tablefieldinfo_view;
741
CREATE VIEW TSystem.tablefieldinfo_view AS
742

    
743
  SELECT
744
    -- this filters out composite indicies and duplicated FKs on same columns
745
    DISTINCT ON ( n.nspname, c.relname, a.attnum )
746

    
747
    -- this function is used by the information schema views
748
    -- the bitmask works like this:
749
    --    b'00000100' = deleteable
750
    --    b'00001000' = updateable
751
    --    b'00010000' = insertable
752
    (pg_relation_is_updatable(c.oid::regclass, false)::bit(8) & b'00011100' = b'00011100' ) AS isWritable,
753

    
754
    c.relkind = 'v' AS isview,
755
    n.nspname       AS schemaname,
756
    c.relname       AS tablename,
757
    a.attnum        AS index,
758
    a.attname       AS field,
759

    
760
    -- t.typcategory,
761
    format_type( a.atttypid, null ) AS type,
762

    
763
    -- length only for string types
764
    CASE WHEN
765
        -- S = varchars und chars
766
        t.typcategory IN ( 'S' )
767
      THEN nullif(a.atttypmod,-1) - 4
768
      ELSE null
769
    END
770
    AS length,
771

    
772
    -- adsrc was removed in pg12
773
    pg_get_expr( d.adbin, d.adrelid ) AS "default",
774

    
775
    fn.nspname AS foreign_table_schema,
776
    ft.relname AS foreign_table_name,
777
    fc.attname AS foreign_column_name
778

    
779
  FROM
780
    pg_class                  AS c
781

    
782
    -- schemata
783
    LEFT JOIN pg_namespace    AS n ON
784
          n.oid = c.relnamespace
785

    
786
    -- columns
787
    LEFT JOIN pg_attribute    AS a ON
788
          c.oid = a.attrelid
789

    
790
    -- columntypes
791
    LEFT JOIN pg_type         AS t ON
792
          t.oid = a.atttypid
793

    
794
    -- default values of columns
795
    LEFT JOIN pg_attrdef      AS d ON
796
          d.adrelid = c.oid
797
      AND d.adnum = a.attnum
798

    
799
    -- FKs
800
    LEFT JOIN pg_constraint   AS f ON
801
          f.contype = 'f'             -- foreignkey
802
      AND f.conrelid = c.oid          -- local table
803
      AND array_length ( f.confkey , 1 ) < 2 -- exclude composite keys
804
      AND f.conkey[1] = a.attnum      -- conkey is a array over the attributes ordinal positions
805

    
806
    -- destination of FKs
807
    LEFT JOIN pg_attribute    AS fc ON
808
          f.confrelid  = fc.attrelid -- foreign table
809
      AND f.confkey[1] = fc.attnum
810

    
811
    LEFT JOIN pg_class        AS ft ON
812
          ft.oid = f.confrelid
813

    
814
    LEFT JOIN pg_namespace    AS fn ON
815
          fn.oid = ft.relnamespace
816

    
817
  WHERE
818
    -- only tables and views ( including materialized views )
819
        c.relkind IN ('r','v','m')
820
    -- p = permanent table ( default tables)
821
    -- u = unlogged table ( eg. tlog.auditlog )
822
    -- t = temporary table ( pg_temp_%, create temp table )
823
    AND c.relpersistence IN ('p','u')
824
    -- exclude certain namespaces; they are lowercase by default, except for doubleQuoted Identifier
825
    AND n.nspname NOT IN (
826
         'pg_catalog', 'information_schema', 'tcache', 'tsystem', 'sunext', 'import', 'z_99_drop', 'x_900_export'
827
       )
828
    AND a.attnum > 0
829
    -- they have been deleted anyways by the TSystem.tablefieldinfo__recreate() function
830
    AND a.attname NOT IN ('insert_by', 'modified_by', 'insert_date', 'modified_date')
831
    -- we must omit dropped columns
832
    AND a.attisdropped IS false
833

    
834
  ORDER BY schemaname, tablename, index
835
;
836
--
837
	
838
    EXCEPTION
839
		WHEN others THEN
840
       		RAISE WARNING '%', SQLERRM;
841
	END; 
842

    
843

    
844
	BEGIN
845

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

    
848
CREATE FUNCTION TSystem.tablefieldinfo__recreate(OUT fieldCountBefore INTEGER, OUT fieldCountAfter INTEGER) RETURNS RECORD AS $$
849
  BEGIN
850
    FieldCountBefore := COUNT(*) FROM tablefieldinfo;
851
    -- Einfach alles rauswerfen und neu aufbauen aus den Information-Schema Katalogen.
852
    TRUNCATE tablefieldinfo;
853
    INSERT INTO tablefieldinfo ( isWritable, isView, schemaname, tablename, index, field, type, length, def, foreign_schema, foreign_table, foreign_column)
854
    SELECT * FROM TSystem.TableFieldInfo_view ORDER BY schemaname, tablename, field;
855
    -- View ist Updatable und wird als ChildLink benutzt. Also brauchen wir Defaults und Foreign-Keys.
856
    PERFORM TSystem.CopyConstraintInfo('public', 'oplpm_data', 'public', 'oplpm');
857
    PERFORM TSystem.CopyConstraintInfo('public', 'oplpm_stam', 'public', 'oplpm_data');
858
    -- view dbrid default wert setzen
859
    UPDATE tablefieldinfo SET def = 'nextval(''db_id_seq'')' WHERE isView AND isWritable AND field = 'dbrid';
860
    FieldCountAfter :=  COUNT(*) FROM tablefieldinfo;
861
    --- #18294 Auditlog-Config-FieldList Refresh
862
    --PERFORM tlog.AuditlogConfig_OF__all__recreate();
863
    RETURN;
864
  END $$ LANGUAGE plpgsql VOLATILE;
865

    
866
	
867
    EXCEPTION
868
		WHEN others THEN
869
       		RAISE WARNING '%', SQLERRM;
870
	END; 
871

    
872

    
873
	BEGIN
874

    
875
  CREATE FUNCTION dbupdates__filtered__nodes__upd_ids__get() RETURNS SETOF VARCHAR AS $$
876
      WITH _nodes AS (
877
            SELECT upd_id FROM dbupdates
878
             WHERE upd_donedat >= current_timestamp - '90 days'::INTERVAL
879
                OR upd_donedat IS NULL
880
                OR coalesce(modified_date, insert_date::TIMESTAMP) >= current_timestamp - '90 days'::INTERVAL
881
                OR upd_sperr
882
           ),
883
           _parents AS (
884
            WITH RECURSIVE _tree AS (
885
                  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)
886
                  UNION
887
                  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
888
            )
889
            SELECT upd_id FROM _tree
890
             WHERE depth < 0
891
             ORDER BY depth
892
           )
893
           SELECT * FROM _nodes
894
           UNION
895
           SELECT * FROM _parents
896
  $$ LANGUAGE SQL;
897
	
898
    EXCEPTION
899
		WHEN others THEN
900
       		RAISE WARNING '%', SQLERRM;
901
	END; 
902
	
903
	
904
	
905
	
906
	BEGIN
907
	
908
CREATE TYPE tsystem.dblink__connection
909
  AS ENUM (
910
    'default',
911
    'syncro'
912
  );
913

    
914
CREATE OR REPLACE FUNCTION tsystem.dblink__connectionstring__get(_t tsystem.dblink__connection DEFAULT 'default')
915
  RETURNS varchar AS $$
916
  DECLARE result varchar;
917
  BEGIN
918
    CASE _t
919
        WHEN 'default' THEN
920
            result := 'host=localhost port=' || inet_server_port()::integer || ' dbname=' || current_database() || ' user=SYS.dblink password=SYS.dblink';
921
        WHEN 'syncro' THEN
922
            result := 'host=pg.prodat-erp.de port=5432 dbname=PRODAT-18.08 user=syncro password=syncro';
923
        ELSE
924
            RAISE EXCEPTION 'Unknown connection type: %', _t;
925
    END CASE;
926
    RETURN result;
927
  END $$ LANGUAGE plpgsql IMMUTABLE;	
928
	
929
    EXCEPTION
930
		WHEN others THEN
931
       		RAISE WARNING '%', SQLERRM;
932
	END; 	
933
	
934
	
935
	
936
	
937

    
938
	BEGIN
939

    
940
CREATE OR REPLACE FUNCTION tsystem.syncro__dbupdates(IN _dblink VARCHAR DEFAULT tsystem.dblink__connectionstring__get( 'syncro' ) ) RETURNS void AS $$
941
  BEGIN
942
    SET LOCAL SESSION AUTHORIZATION syncro;
943

    
944
    -- NotThisFields: dbrid,upd_donedat
945
    INSERT INTO dbupdates ( upd_id,
946
                            upd_parent,
947
                            upd_minver,
948
                            upd_kunde,
949
                            --upd_donedat,
950
                            upd_bez,
951
                            upd_txt,
952
                            upd_sql,
953
                            upd_projekt,
954
                            upd_noerr,
955
                            upd_sperr,
956
                            upd_released,
957
                            upd_released_dat,
958
                            --
959
                            insert_date,
960
                            insert_by,
961
                            modified_by,
962
                            modified_date
963
                          )
964

    
965
    SELECT *
966
      FROM dblink(_dblink,
967
                   'SELECT upd_id,
968
                           upd_parent,
969
                           upd_minver,
970
                           upd_kunde,
971
                           --upd_donedat,
972
                           upd_bez,
973
                           upd_txt,
974
                           upd_sql,
975
                           upd_projekt,
976
                           upd_noerr,
977
                           upd_sperr,
978
                           upd_released,
979
                           upd_released_dat,
980
                           --
981
                           insert_date,
982
                           insert_by,
983
                           modified_by,
984
                           modified_date
985
                      FROM dbupdates
986
                     WHERE
987
                            ( upd_kunde IS NULL OR upd_kunde LIKE ' || TSystem.quote_literal__connstr_param( TSystem.Settings__Get( 'KUNDE' ) ) || ' )
988
                          AND upd_minver <= ' || TSystem.quote_literal__connstr_param( TSystem.Settings__Get( 'ProdatVersion' ) ) || '
989
                          AND NOT upd_sperr
990
                          AND     upd_released ')
991
        AS ( _upd_id       varchar(30),
992
             upd_parent    varchar(30),              -- parent (Baumstruktur)
993
             upd_minver    varchar(11),              -- [SYNCRO:Version] Mindest-Programmversion
994
             upd_kunde     varchar(20),              -- [SYNCRO:Kunde]
995
             --upd_donedat timestamp(0),             -- [SYNCRO:NotThisFields] update eingespielt am
996
             upd_bez       varchar(150),
997
             upd_txt       text,
998
             upd_sql       text,
999
             upd_projekt   varchar(100),
1000
             upd_noerr     boolean,
1001
             upd_sperr     boolean,
1002
             upd_released  boolean,
1003
             upd_released_dat timestamp(0),
1004
             -- System (tables__generate_missing_fields)
1005
             insert_date   date,
1006
             insert_by     varchar(32),
1007
             modified_by   varchar(32),
1008
             modified_date timestamp(0)               -- [SYNCRO:Modified]
1009
           )
1010
     WHERE NOT EXISTS( SELECT true FROM dbupdates WHERE upd_id = _upd_id );
1011
    ---
1012

    
1013
    RAISE NOTICE 'dbupdates %', (SELECT count(*) FROM dbupdates);
1014
  END $$ LANGUAGE plpgsql;
1015
	
1016
    EXCEPTION
1017
		WHEN others THEN
1018
       		RAISE WARNING '%', SQLERRM;
1019
	END; 
1020

    
1021
	BEGIN
1022

    
1023
PERFORM tsystem.syncro__dbupdates();
1024
	
1025
    EXCEPTION
1026
		WHEN others THEN
1027
       		RAISE WARNING '%', SQLERRM;
1028
	END; 
1029

    
1030

    
1031
END $do$ LANGUAGE plpgsql;
(1-1/3)