Projekt

Allgemein

Profil

06 Update Umzug Migration Postgres 13 17 (ab Prodat 2104) » update.sql

Dies zuerst. Funktionen und Columns - [X] Daniel S, 27.10.2025 12:43

 
1
ALTER TABLE tablefieldinfo ADD COLUMN IF NOT EXISTS foreign_schema varchar(100);
2

    
3
ALTER TABLE tablefieldinfo ADD COLUMN IF NOT EXISTS   foreign_table         VARCHAR(100);           -- Die Spalte referenziert auf diese Tabelle ...
4
ALTER TABLE tablefieldinfo ADD COLUMN IF NOT EXISTS   foreign_column        VARCHAR(50);            -- ... und Spalte
5

    
6
ALTER TABLE tablefieldinfo ADD COLUMN IF NOT EXISTS   isWritable            BOOLEAN DEFAULT false;
7

    
8
ALTER TABLE recnogroup ADD COLUMN IF NOT EXISTS reg_gruppe_textno      INTEGER;
9
ALTER TABLE recnogroup ADD COLUMN IF NOT EXISTS reg_bez_textno         INTEGER;
10

    
11
ALTER TABLE SettingsDyn ADD COLUMN IF NOT EXISTS sd_deleted      BOOLEAN DEFAULT False;
12

    
13
ALTER TABLE adk ADD COLUMN IF NOT EXISTS ad_dokversand INTEGER;
14
ALTER TABLE anfart ADD COLUMN IF NOT EXISTS aArt_aknr_idx  VARCHAR(30);
15

    
16
--- Liefert Dokumentversandbezeuchnung von ad_dokversand
17
do $f$
18
BEGIN
19
BEGIN
20
 EXECUTE $f2$
21
  CREATE FUNCTION TAdk.DokVersandTyp(IN _ad_dokversand INTEGER, OUT ad_dokversand INTEGER,  OUT ad_DokVersandBez VARCHAR) RETURNS RECORD AS $$
22
   BEGIN
23
     SELECT null, null INTO ad_dokversand, ad_DokVersandBez;
24
   END $$ LANGUAGE plpgsql STABLE;
25
 $f2$;
26
EXCEPTION WHEN others THEN null; END;
27
END
28
$f$ LANGUAGE plpgsql;
29
 
30
ALTER TABLE belegdokument ADD COLUMN IF NOT EXISTS beld_gewicht NUMERIC(12,4);
31
ALTER TABLE belegpos      ADD COLUMN IF NOT EXISTS belp_gewicht NUMERIC(12,4);
32

    
33

    
34
ALTER TABLE belegpos ADD COLUMN IF NOT EXISTS belp_bstat VARCHAR(2) REFERENCES auftgbs ON UPDATE CASCADE ON DELETE SET NULL; -- Statusflags1
35
ALTER TABLE belegpos ADD COLUMN IF NOT EXISTS belp_bstat1 VARCHAR(2) REFERENCES auftgbs ON UPDATE CASCADE ON DELETE SET NULL; -- Statusflags2
36
ALTER TABLE belegpos ADD COLUMN IF NOT EXISTS belp_bstat2 VARCHAR(2) REFERENCES auftgbs ON UPDATE CASCADE ON DELETE SET NULL; -- Statusflags3
37

    
38

    
39
/*
40
ALTER TABLE belegposabzu ADD COLUMN IF NOT EXISTS belpaz_type          VARCHAR(1)  DEFAULT 'E';
41
ALTER TABLE belegposabzu ADD COLUMN IF NOT EXISTS belpaz_pos           INTEGER;
42
ALTER TABLE belegposabzu ADD COLUMN IF NOT EXISTS belpaz_zutxt_int     TEXT;
43

    
44
ALTER TABLE belegabzu ADD COLUMN IF NOT EXISTS belaz_type          VARCHAR(1) DEFAULT 'E';
45
ALTER TABLE belegabzu ADD COLUMN IF NOT EXISTS belaz_pos           INTEGER;
46
ALTER TABLE belegabzu ADD COLUMN IF NOT EXISTS belaz_zutxt_int     TEXT;
47

    
48
ALTER TABLE belabzu ADD COLUMN IF NOT EXISTS beaz_type          VARCHAR(1) DEFAULT 'E';
49
ALTER TABLE belabzu ADD COLUMN IF NOT EXISTS beaz_pos           INTEGER;
50
ALTER TABLE belabzu ADD COLUMN IF NOT EXISTS beaz_zutxt_int     TEXT;
51

    
52
ALTER TABLE ldsabzu ADD COLUMN IF NOT EXISTS ldaz_type          VARCHAR(1) DEFAULT 'E';
53
ALTER TABLE ldsabzu ADD COLUMN IF NOT EXISTS ldaz_pos           INTEGER;
54
ALTER TABLE ldsabzu ADD COLUMN IF NOT EXISTS ldaz_zutxt_int     TEXT;
55
ALTER TABLE ldsabzu ADD COLUMN IF NOT EXISTS ldaz_visible       BOOLEAN NOT NULL DEFAULT TRUE;
56

    
57
ALTER TABLE belzeil_grund ADD COLUMN IF NOT EXISTS bz_vkp_mce       INTEGER REFERENCES artmgc;
58
ALTER TABLE ldsdok ADD COLUMN IF NOT EXISTS ld_ekp_mce           INTEGER REFERENCES artmgc;
59
ALTER TABLE ldsdok ADD COLUMN IF NOT EXISTS ld_ekp_mce           INTEGER REFERENCES artmgc;
60
ALTER TABLE auftg ADD COLUMN IF NOT EXISTS ag_vkp_mce           INTEGER REFERENCES artmgc;
61

    
62

    
63
ALTER TABLE artpruefung ADD COLUMN IF NOT EXISTS apr_doktxt     Text;
64
ALTER TABLE artpruefung ADD COLUMN IF NOT EXISTS apr_aufdok     BOOL NOT NULL DEFAULT FALSE;
65
ALTER TABLE artpruefung ADD COLUMN IF NOT EXISTS apr_abz_id     INTEGER REFERENCES abzu ON UPDATE CASCADE;
66

    
67
ALTER TABLE ab2ba ADD COLUMN IF NOT EXISTS a2ba_noz_id          INTEGER REFERENCES normzert;
68
--*/
69

    
70
CREATE FUNCTION TSystem.Settings__GetBool(vari varchar, defvalue boolean DEFAULT false) RETURNS boolean AS $$
71
    DECLARE r boolean;
72
              s varchar;
73
    BEGIN
74
       IF vari = 'AdminLoginAllowed' THEN RETURN true; END IF;
75

    
76
       SELECT s_inha INTO s FROM public.settings WHERE s_vari = vari;
77
       --
78
       IF NOT FOUND THEN
79
              RETURN defvalue;
80
       END IF;
81
       --
82
       IF UPPER(s) IN ('-1','1', 'T', 'TRUE') THEN
83
              RETURN true;
84
       ELSE
85
              RETURN false;
86
       END IF;
87
    END$$LANGUAGE plpgsql PARALLEL SAFE;
88
	
89
	CREATE OR REPLACE FUNCTION TSystem.Settings__GetText(vari varchar)
90
    RETURNS text
91
    AS $$
92
        SELECT coalesce(
93
                    (SELECT s_inha FROM public.settings WHERE s_vari = vari)
94
                    , ''
95
               );
96
    $$ LANGUAGE sql PARALLEL SAFE;
97

    
98
-- Hinweis: Begrenzung von den 8191 Zeichen, im PgDAC, bei vom VARCHAR ohne Längenangabe.
99
CREATE FUNCTION TSystem.Settings__Get(vari varchar)
100
    RETURNS varchar
101
    AS $$
102
        SELECT TSystem.Settings__GetText(vari);
103
    $$LANGUAGE sql PARALLEL SAFE;
104
	
105
	
106
-- Setting als BOOL setzen
107
CREATE FUNCTION TSystem.Settings__Set(vari VARCHAR, inha BOOL) RETURNS VOID AS $$
108
  BEGIN
109
    IF inha IS NULL THEN
110
        PERFORM TSystem.Settings__Delete(vari);
111
        RETURN;
112
    END IF;
113
    IF inha THEN
114
        PERFORM TSystem.Settings__Set(vari, '-1');  -- true
115
    ELSE
116
        PERFORM TSystem.Settings__Set(vari, '0');   -- false
117
    END IF;
118

    
119
    RETURN;
120
  END $$ LANGUAGE plpgsql;
121

    
122
--
123

    
124
-- Setting als VARCHAR setzen
125
CREATE FUNCTION TSystem.Settings__Set(vari VARCHAR, inha VARCHAR) RETURNS VOID AS $$
126
  DECLARE num NUMERIC;
127
  BEGIN
128
    IF inha IS NULL THEN
129
        PERFORM TSystem.Settings__Delete(vari);
130
        RETURN;
131
    END IF;
132
    IF EXISTS(SELECT true FROM public.settings WHERE s_inha = inha AND s_vari = vari) THEN
133
        RETURN;
134
    END IF;
135
    BEGIN
136
        num:= inha::NUMERIC(20,8); -- Cast auf max. Numeric versuchen. Länge entspr. Standard für interne Werte.
137
    EXCEPTION
138
        WHEN OTHERS THEN num:= NULL;
139
    END;
140
    UPDATE settings SET s_inha= inha, s_num_inha= num WHERE s_vari = vari;
141
    IF NOT FOUND THEN
142
        INSERT INTO settings (s_vari, s_inha, s_num_inha) VALUES (vari, inha, num);
143
    END IF;
144

    
145
    RETURN;
146
  END $$ LANGUAGE plpgsql;
147

    
148
--
149

    
150
-- Setting als INTEGER setzen
151
CREATE FUNCTION TSystem.Settings__Set(vari VARCHAR, inha INTEGER) RETURNS VOID AS $$
152
  DECLARE num NUMERIC;
153
  BEGIN
154
    IF inha IS NULL THEN
155
        PERFORM TSystem.Settings__Delete(vari);
156
        RETURN;
157
    END IF;
158
    IF EXISTS(SELECT true FROM public.settings WHERE s_inha = inha::VARCHAR AND s_vari = vari) THEN
159
        RETURN;
160
    END IF;
161
    BEGIN
162
        num:= inha::NUMERIC(20,8); -- Cast auf max. Numeric versuchen. Länge entspr. Standard für interne Werte.
163
    EXCEPTION
164
        WHEN OTHERS THEN num:= NULL;
165
    END;
166
    UPDATE settings SET s_inha= inha::VARCHAR, s_num_inha= num WHERE s_vari = vari;
167
    IF NOT FOUND THEN
168
        INSERT INTO settings (s_vari, s_inha, s_num_inha) VALUES (vari, inha::VARCHAR, num);
169
    END IF;
170

    
171
    RETURN;
172
  END $$ LANGUAGE plpgsql;
173
	
174

    
175
  -- Value aus einem INI-TEXT auslesen -> [Section] Name=Value
176
DO $f$
177
BEGIN
178
BEGIN
179
 EXECUTE $f2$
180
  CREATE FUNCTION TSystem.INI_GetValue(ini TEXT, section VARCHAR, name VARCHAR, defvalue VARCHAR DEFAULT NULL) RETURNS VARCHAR AS $$
181
  DECLARE
182
    sectionsinhalt TEXT;
183
    val VARCHAR;
184
  BEGIN
185
    --Inhalt der eingegebenen 'section' ablesen oder 'defvalue' nehmen, wenn nicht gefunden
186
    SELECT trim(substring(ini FROM E'\\[' || section || E'\\]([^\\[]*)'), E'\r\n\t ') INTO sectionsinhalt;
187
    IF sectionsinhalt IS NULL THEN
188
      RETURN defvalue;
189
    END IF;
190

    
191
    --Value mit dem 'name' aus der 'section' ablesen oder 'defvalue' nehmen, wenn nicht gefunden
192
    SELECT COALESCE(trim(substring(sectionsinhalt FROM E'[$\r\n]*' || name || E'[ \t]*=[ \t]*([^\r\n$]*)'), E'\r\n\t '), defvalue) INTO val;
193

    
194
    RETURN val;
195
  END $$ LANGUAGE plpgsql IMMUTABLE;
196
 $f2$;
197
 EXCEPTION WHEN others THEN null; END;
198
END
199
$f$ LANGUAGE plpgsql;
200

    
201
  
202
CREATE FUNCTION tsystem.dokutypes__find__by__parentnode_id( _parentnode_id varchar )
203
  RETURNS varchar
204
  AS $$
205
     SELECT null
206
  $$ LANGUAGE sql;  
207
  
208
CREATE FUNCTION tsystem.database__triggers_inaktiv__get(
209
    IN _all_schemas   boolean = false
210
    )
211
    RETURNS TABLE (
212
      tgname          varchar,
213
      src_schemaname  varchar,
214
      src_tablename   varchar,
215
      trg_schemaname  varchar,
216
      trg_tablename   varchar
217
    )
218
    AS $$
219
          -- hinweis: cast as varchar nur in pg kleiner 13?!
220
          SELECT tgname::varchar,
221
                 src_schema.nspname::varchar  AS src_schemaname,
222
                 src_table.relname::varchar   AS src_tablename,
223
                 trg_schema.nspname::varchar  AS trg_schemaname,
224
                 trg_table.relname::varchar   AS trg_tablename
225
            FROM pg_trigger
226
            LEFT JOIN pg_class      AS src_table  ON src_table.oid  = pg_trigger.tgrelid
227
            LEFT JOIN pg_class      AS trg_table  ON trg_table.oid  = pg_trigger.tgconstrrelid
228
            LEFT JOIN pg_namespace  AS src_schema ON src_schema.oid = src_table.relnamespace
229
            LEFT JOIN pg_namespace  AS trg_schema ON trg_schema.oid = trg_table.relnamespace
230
           WHERE tgenabled = 'D'
231
             AND (
232
                  -- Prüfung auf deaktivierte Trigger für alle Schemata
233
                      _all_schemas
234
                  -- Prüfung auf deaktivierte Trigger gilt nicht für folg. Schemata
235
                    -- ignore:    trigger on drop,   fkey: public -> drop, drop -> public, drop -> drop
236
                    -- relevant:  trigger on public, fkey: public -> public
237
                  OR  (
238
                       -- Quelle des deaktivierten Triggers bzw. Contraint-Triggers (fKey) ist nicht in folg. Schemata
239
                           coalesce( src_schema.nspname, '' ) NOT IN ( 'z_99_drop', 'x_950_import', 'x_900_export' )
240
                       -- analog für Ziel des Contraint-Triggers (fKey)
241
                       AND coalesce( trg_schema.nspname, '' ) NOT IN ( 'z_99_drop', 'x_950_import', 'x_900_export' )
242
                      )
243
                 )
244
           ORDER BY tgname
245
    $$ LANGUAGE sql;
246
		
247
		
248
		
249
		
250
--
251
CREATE FUNCTION TSystem.triggers__all__disable() RETURNS VOID AS $$
252
  DECLARE r RECORD;
253
  BEGIN
254
    BEGIN
255
      PERFORM TSystem.Settings__Set('triggersdisabled', True);
256
    EXCEPTION WHEN OTHERS THEN
257
      PERFORM TSystem.Settings__Set('triggersdisabled', True);
258
    END;
259

    
260
    FOR r IN
261
      --SELECT DISTINCT schemaname, tablename
262
      --FROM tablefieldinfo
263
      --WHERE schemaname NOT IN ('z_99_drop', 'import')
264
      --  AND tablename NOT IN ('tablefieldinfo')  -- es gibt ein SELECT darauf, drum lässt sich kein ALTER TABLE machen
265
      --  AND NOT isView
266
      SELECT DISTINCT table_schema AS schemaname, table_name AS tablename
267
      FROM information_schema.tables
268
      WHERE table_catalog = current_database()
269
        AND table_type = 'BASE TABLE'
270
        AND table_schema NOT IN ('information_schema', 'pg_catalog', 'z_99_drop', 'import')
271
    LOOP
272
      EXECUTE 'ALTER TABLE ' || quote_ident(r.schemaname) || '.' || quote_ident(r.tablename) || ' DISABLE TRIGGER ALL';
273
    END LOOP;
274
  END $$ LANGUAGE plpgsql;
275
--
276

    
277
--
278
CREATE FUNCTION TSystem.triggers__all__enable() RETURNS VOID AS $$
279
  DECLARE r RECORD;
280
  BEGIN
281
    FOR r IN  -- aus TFormDBUpdates.Up_EnableTrigger -> lokales CodeSelect
282
      SELECT DISTINCT table_schema AS schemaname, table_name AS tablename
283
      FROM information_schema.tables
284
      WHERE table_catalog = current_database()
285
        AND table_type = 'BASE TABLE'
286
        AND table_schema NOT IN ('information_schema', 'pg_catalog', 'z_99_drop', 'import')
287
    LOOP
288
      EXECUTE 'ALTER TABLE ' || quote_ident(r.schemaname) || '.' || quote_ident(r.tablename) || ' ENABLE TRIGGER ALL';
289
    END LOOP;
290

    
291
    BEGIN
292
      PERFORM TSystem.Settings__Set('triggersdisabled', False);
293
    EXCEPTION WHEN OTHERS THEN
294
      PERFORM TSystem.Settings__Set('triggersdisabled', False);
295
    END;
296
  END $$ LANGUAGE plpgsql;		
297
  
298
DO $f$
299
BEGIN
300
BEGIN
301
 EXECUTE $f2$
302
    CREATE FUNCTION TSystem.LogDebug(source VARCHAR, message TEXT, category INTEGER DEFAULT 0, context TEXT DEFAULT NULL) RETURNS VOID AS $$
303
      BEGIN
304
        RETURN;
305
      END $$ LANGUAGE plpgsql;
306
 $f2$;
307
 EXCEPTION WHEN others THEN null; END;
308
END
309
$f$ LANGUAGE plpgsql;	  
310

    
311

    
312
-- Erstellt einen View zur Abfrage von DB-Tabellen, Views darauf, Feldern und ForeignKeys der Felder. Schließt PG_catalog und einige System-Schemata aus.
313
DROP VIEW IF EXISTS TSystem.tablefieldinfo_view;
314
CREATE VIEW TSystem.tablefieldinfo_view AS
315

    
316
  SELECT
317
    -- this filters out composite indicies and duplicated FKs on same columns
318
    DISTINCT ON ( n.nspname, c.relname, a.attnum )
319

    
320
    -- this function is used by the information schema views
321
    -- the bitmask works like this:
322
    --    b'00000100' = deleteable
323
    --    b'00001000' = updateable
324
    --    b'00010000' = insertable
325
    (pg_relation_is_updatable(c.oid::regclass, false)::bit(8) & b'00011100' = b'00011100' ) AS isWritable,
326

    
327
    c.relkind = 'v' AS isview,
328
    n.nspname       AS schemaname,
329
    c.relname       AS tablename,
330
    a.attnum        AS index,
331
    a.attname       AS field,
332

    
333
    -- t.typcategory,
334
    format_type( a.atttypid, null ) AS type,
335

    
336
    -- length only for string types
337
    CASE WHEN
338
        -- S = varchars und chars
339
        t.typcategory IN ( 'S' )
340
      THEN nullif(a.atttypmod,-1) - 4
341
      ELSE null
342
    END
343
    AS length,
344

    
345
    -- adsrc was removed in pg12
346
    pg_get_expr( d.adbin, d.adrelid ) AS "default",
347

    
348
    fn.nspname AS foreign_table_schema,
349
    ft.relname AS foreign_table_name,
350
    fc.attname AS foreign_column_name
351

    
352
  FROM
353
    pg_class                  AS c
354

    
355
    -- schemata
356
    LEFT JOIN pg_namespace    AS n ON
357
          n.oid = c.relnamespace
358

    
359
    -- columns
360
    LEFT JOIN pg_attribute    AS a ON
361
          c.oid = a.attrelid
362

    
363
    -- columntypes
364
    LEFT JOIN pg_type         AS t ON
365
          t.oid = a.atttypid
366

    
367
    -- default values of columns
368
    LEFT JOIN pg_attrdef      AS d ON
369
          d.adrelid = c.oid
370
      AND d.adnum = a.attnum
371

    
372
    -- FKs
373
    LEFT JOIN pg_constraint   AS f ON
374
          f.contype = 'f'             -- foreignkey
375
      AND f.conrelid = c.oid          -- local table
376
      AND array_length ( f.confkey , 1 ) < 2 -- exclude composite keys
377
      AND f.conkey[1] = a.attnum      -- conkey is a array over the attributes ordinal positions
378

    
379
    -- destination of FKs
380
    LEFT JOIN pg_attribute    AS fc ON
381
          f.confrelid  = fc.attrelid -- foreign table
382
      AND f.confkey[1] = fc.attnum
383

    
384
    LEFT JOIN pg_class        AS ft ON
385
          ft.oid = f.confrelid
386

    
387
    LEFT JOIN pg_namespace    AS fn ON
388
          fn.oid = ft.relnamespace
389

    
390
  WHERE
391
    -- only tables and views ( including materialized views )
392
        c.relkind IN ('r','v','m')
393

    
394
    -- p = permanent table ( default tables)
395
    -- u = unlogged table ( eg. tlog.auditlog )
396
    -- t = temporary table ( pg_temp_%, create temp table )
397
    AND c.relpersistence IN ('p','u')
398

    
399
    -- exclude certain namespaces; they are lowercase by default, except for doubleQuoted Identifier
400
    AND n.nspname NOT IN (
401
         'pg_catalog', 'information_schema', 'tcache', 'tsystem', 'sunext', 'import', 'z_99_drop', 'x_900_export'
402
       )
403

    
404
    -- hide internal fields
405
    -- # select attname, attnum from pg_attribute where attrelid = 'abk'::regclass::oid and attnum < 3
406
    -- ┌──────────────┬────────┐
407
    -- │   attname    │ attnum │
408
    -- ╞══════════════╪════════╡
409
    -- │ tableoid     │     -7 │
410
    -- │ cmax         │     -6 │
411
    -- │ xmax         │     -5 │
412
    -- │ cmin         │     -4 │
413
    -- │ xmin         │     -3 │
414
    -- │ ctid         │     -1 │
415
    -- │ ab_ix        │      1 │
416
    -- │ ab_parentabk │      2 │
417
    -- └──────────────┴────────┘
418
    AND a.attnum > 0
419

    
420
    -- they have been deleted anyways by the TSystem.tablefieldinfo__recreate() function
421
    AND a.attname NOT IN ('insert_by', 'modified_by', 'insert_date', 'modified_date')
422

    
423
    -- we must omit dropped columns
424
    AND a.attisdropped IS false
425

    
426

    
427
  ORDER BY schemaname, tablename, index
428
;
429
  
430
-- Ausgelagert aus Delphi. Ergänzt um Weitergabe der Constraints zugrundeliegender Tabelle an die Views.
431
CREATE OR REPLACE FUNCTION TSystem.tablefieldinfo__recreate(OUT fieldCountBefore INTEGER, OUT fieldCountAfter INTEGER) RETURNS RECORD AS $$
432
  BEGIN
433
    FieldCountBefore := COUNT(*) FROM tablefieldinfo;
434

    
435
    -- Einfach alles rauswerfen und neu aufbauen aus den Information-Schema Katalogen.
436
    TRUNCATE tablefieldinfo;
437

    
438
    INSERT INTO tablefieldinfo ( isWritable, isView, schemaname, tablename, index, field, type, length, def, foreign_schema, foreign_table, foreign_column)
439
    SELECT * FROM TSystem.TableFieldInfo_view ORDER BY schemaname, tablename, field;
440

    
441
    -- View ist Updatable und wird als ChildLink benutzt. Also brauchen wir Defaults und Foreign-Keys.
442
    PERFORM TSystem.CopyConstraintInfo('public', 'oplpm_data', 'public', 'oplpm');
443
    PERFORM TSystem.CopyConstraintInfo('public', 'oplpm_stam', 'public', 'oplpm_data');
444

    
445
    -- view dbrid default wert setzen
446
    UPDATE tablefieldinfo SET def = 'nextval(''db_id_seq'')' WHERE isView AND isWritable AND field = 'dbrid';
447

    
448
    FieldCountAfter :=  COUNT(*) FROM tablefieldinfo;
449

    
450
    --- #18294 Auditlog-Config-FieldList Refresh
451
    --PERFORM tlog.AuditlogConfig_OF__all__recreate();
452

    
453
    RETURN;
454
  END $$ LANGUAGE plpgsql VOLATILE;
455
--
456

    
457
CREATE OR REPLACE FUNCTION TSystem.CopyConstraintInfo( srcSchema VARCHAR,  srcTable VARCHAR,  trgSchema VARCHAR,  trgViewOrTableName VARCHAR) RETURNS VOID AS $$
458
  BEGIN
459

    
460
    -- kopiert spalten defaultwert von tabellen in view informationen
461
    UPDATE tablefieldinfo AS trg SET
462
        def            = CASE WHEN trg.isWritable THEN src.def ELSE NULL END,
463
        foreign_table  = src.foreign_table,
464
        foreign_column = src.foreign_column
465
      FROM tablefieldinfo AS src
466
      WHERE trg.schemaname = trgSchema
467
        AND trg.tablename  = trgViewOrTableName
468
        AND src.Field      = trg.field
469
        AND src.schemaname = srcSchema
470
        AND src.tablename  = srcTable;
471
    RETURN;
472
  END $$ LANGUAGE plpgsql VOLATILE;  
473
  
474
SELECT TSystem.tablefieldinfo__recreate();  
475

    
476

    
477
-- DELETE FROM dbupdates WHERE upd_kunde IS NOT null
(1-1/3)