Projekt

Allgemein

Profil

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

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

 
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
ALTER TABLE dbupdates DISABLE TRIGGER ALL;
307
UPDATE dbupdates SET upd_released_dat = '2000-01-01' WHERE upd_released AND upd_released_dat IS null;
308
ALTER TABLE dbupdates ENABLE TRIGGER ALL;
309

    
310

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

    
316
	BEGIN
317

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

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

    
337
	BEGIN
338

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

    
349
	BEGIN
350

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

    
361
	BEGIN
362

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

    
406
	BEGIN
407

    
408
SELECT TSystem.views__Adressen__recreate();	
409

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

    
415

    
416
	BEGIN
417

    
418
CREATE SCHEMA IF NOT EXISTS tCache;
419

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

    
425
	BEGIN
426

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

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

    
440
	BEGIN
441

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

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

    
452
	BEGIN
453

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

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

    
465
	BEGIN
466

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

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

    
477
	BEGIN
478

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

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

    
489
	BEGIN
490

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

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

    
501
	BEGIN
502

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

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

    
516
	BEGIN
517

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

    
528
	BEGIN
529

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

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

    
551
	BEGIN
552

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

    
559

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

    
565

    
566
	BEGIN
567

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

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

    
613

    
614
	BEGIN
615

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

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

    
647

    
648
	BEGIN
649

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

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

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

    
676

    
677
	BEGIN
678

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

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

    
690

    
691
	BEGIN
692

    
693

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

    
700

    
701
	BEGIN
702

    
703

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

    
710

    
711
	BEGIN
712

    
713

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

    
720

    
721
	BEGIN
722

    
723

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

    
730

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

    
738

    
739
	BEGIN
740

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

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

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

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

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

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

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

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

    
780
  FROM
781
    pg_class                  AS c
782

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

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

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

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

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

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

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

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

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

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

    
844

    
845
	BEGIN
846

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

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

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

    
873

    
874
	BEGIN
875

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

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

    
939
	BEGIN
940

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

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

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

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

    
1022
	BEGIN
1023

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

    
1031

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