Projekt

Allgemein

Profil

06 Update Postgres 13 15 (ab Prodat 2104) » Historie » Version 16

[X] Daniel S, 08.08.2023 18:04

1 5 [X] Daniel S
{{toc}}
2
3 8 [X] Daniel S
h1. Update Postgres 13/15 (ab Prodat 2104)
4 1 [X] Daniel S
5
6 9 [X] Daniel S
* Postgres 13/15 Installieren
7 1 [X] Daniel S
* pg_hba.conf übernehmen
8 14 [X] Daniel S
* ALTE SICHERUNGEN ENTFERNEN, sonst wird alles mitgenommen und man muss überall die implicit-casts einspielen!
9 2 [X] Daniel S
* ggf eigene cluster für mandanten wenn diese getrennt sein sollen. > https://redmine.prodat-sql.de/issues/17033#note-15
10 4 [X] Daniel S
* MoveDB Script ausführen. Dazu das Script direkt anpassen (Server und Port). Anweisungen beachten und unbedingt einhalten!
11 1 [X] Daniel S
+ ..\Administration\DB_Admin_BackUp_TestDB\DB_Move_DB_Cluster__too.bat
12 4 [X] Daniel S
13 9 [X] Daniel S
h2. Update Version 12 (Postgres 9) auf Version 2206 (Postgres 13/15)
14 4 [X] Daniel S
15 9 [X] Daniel S
* Postgres 13/15 installieren
16
* gem. oberer Beschreibung den Datenbankcluster in Postgres 13/15 umziehen. Somit wird am Bestandssystem NICHTS geändert.
17 6 [X] Daniel S
* Nachdem der Cluster umgezogen ist, müssen die *2 Files im Anhang* ausgeführt werden
18 4 [X] Daniel S
+ Durch diese Files werden Dummy Funktionen eingespielt, die Kompatiblilität mit dem neuen Client herstellen. Teilweise werden nuf Funktionsrümpfe eingespielt, damit die Oberflächen starten. Durch die DBupdates werden dann die richtigen Funktionen eingespielt
19
+ Wenn es beim Einspielen der Files zu fehlern kommt, muss man checken ob die Funktionen doch bereits vorhanden sind und dann auskommentieren
20 11 [X] Daniel S
21
h2. Update V11
22
23 16 [X] Daniel S
{{collapse(SQL)
24 11 [X] Daniel S
* Gem. V12
25
*# 010 Functions System.sql
26
+ CREATE SCHEMA IF NOT EXISTS TSystem;
27
+ CREATE SCHEMA IF NOT EXISTS z_99_deprecated;
28
*# z0 dcache + comp.sql
29
*# z0 role System.sql
30
*# 0 0 SQL Fielgenerator.sql
31 12 [X] Daniel S
*# Folgende SQL:
32 11 [X] Daniel S
<pre><code class="sql">
33
CREATE TABLE recnogroup (
34
  reg_id                 serial PRIMARY KEY,
35
  reg_schema             varchar(50),                   -- Schema wo die Tabele aus reg_tablename liegt
36
  reg_tablename          varchar(80),                   -- (früher reg_tform) Modulname zur Identifikation der F2s
37
  reg_bez                varchar(100),                  -- Bezeichnung der Artikeleigenschaft Bsp: Oberfläche
38
  reg_gruppe             varchar(80),                   -- Gruppe zu der sie zugeordnet werden kann
39
  reg_ac_n               varchar(9),                    -- X TableContraints: REFERENCES artcod ON UPDATE CASCADE; -- Artikel-Code  kann zugeordent werden
40
  reg_pos                integer,                       -- Position des Parameters innerhalb einer Gruppe für Sortierung in GUI
41
  reg_pname              varchar(40) NOT NULL,          -- eindeutiger Parametername, damit in Triggern / Funktionen nicht mit ID gearbeitet werden muss.
42
  reg_gruppe_textno      integer,                       -- Textnr. Übersetzung für Gruppe
43
  reg_bez_textno         integer,                       -- Textnr. Übersetzung für Bezeichnung
44
  reg_paramtype          varchar(30),                   -- Parametertypen 'ptVARCHAR', 'ptINTEGER', 'ptNUMERIC', 'ptBOOLEAN', 'ptTRISTATEBOOLEAN', 'ptTIMESTAMP', 'ptDATE', 'ptENUM', 'ptTEXT'
45
  reg_default            varchar(100),                  -- Vorgabe bzw. Standardwert des Parameters (in varchar konvertiert)
46
  reg_minvalue           integer,                       -- Min-Wert für Zahlen, Mindestlänge bei varchar
47
  reg_maxvalue           integer,                       -- Max-Wert für Zahlen, Maximallänge bei varchar
48
  reg_vorgabenliste      boolean DEFAULT FALSE,         -- Vorgabenliste: Enum-Set dient als "Vorgabetabelle" für ein Modul.
49
  reg_visible            boolean DEFAULT TRUE,          -- Für 'normale' Nutzer in Register Eigenschaften sichtbar
50
  reg_exclusive          boolean,                       -- Bei Parametertyp ptENUM darf nur ein Enumerationswert angegeben sein, sonst als SET zu betrachten
51
  reg_autoinsert         boolean NOT NULL DEFAULT FALSE,-- Version 1: Flag in Zieltabellentrigger (z.Bsp. am QAB) abfragen, ob RecnoKeyword automatisch
52
                                                        -- angelegt werden soll. Version 2: In table_modified verschieben und komplett automatisieren.
53
  reg_field_name         varchar(50),                   -- Feldname für Vorgabetabelle-Enums, siehe wiki
54
  reg_field_value        varchar(100),                  -- Wert für Vorgabetabelle-Enums, siehe wiki
55
  reg_m_iso              varchar(10),                   -- # 7163 EAV - Datentyp Mengeneinheit
56
57
  -- CHECK for existing schema
58
  CONSTRAINT recnogroup__schema__existing CHECK (
59
          reg_schema IS NULL
60
      OR  tsystem.schema_exists( reg_schema )
61
  ),
62
63
  -- CHECK for existing table within the current searchpath
64
  CONSTRAINT recnogroup__table__existing CHECK (
65
          reg_tablename IS NULL
66
      OR  tsystem.table_exists( reg_tablename, reg_schema )
67
  ),
68
69
  -- CHECK for existing column
70
  CONSTRAINT recnogroup__column__existing CHECK (
71
          reg_field_name IS NULL
72
      OR  tsystem.column_exists( reg_tablename, reg_field_name, coalesce( reg_schema, 'public' ) )
73
  ),
74
75
  --- #18368 CHECK reg_paramtype in Parametertypen-Liste
76
  CONSTRAINT reg_paramtype_in_liste CHECK (
77
          reg_paramtype IN ( 'ptVARCHAR', 'ptINTEGER', 'ptNUMERIC', 'ptBOOLEAN', 'ptTRISTATEBOOLEAN', 'ptTIMESTAMP', 'ptDATE', 'ptENUM', 'ptTEXT' )
78
  )
79
80
);
81
82
83
CREATE TABLE SettingsDyn (
84
  sd_id           INTEGER PRIMARY KEY CHECK (sd_id > 0),  -- [SYNCRO:SyncID]
85
  sd_name         VARCHAR NOT NULL,                       -- TODO [SYNCRO:SyncID]
86
  sd_parentid     INTEGER NOT NULL,
87
  sd_type         VARCHAR(20),
88
  sd_sort         NUMERIC(7, 2),                          -- Sortierungsreihenfolge
89
  sd_config       TEXT,
90
  sd_settingsname VARCHAR(80),
91
  sd_settingstype VARCHAR(20),
92
  sd_vartxtnr     INTEGER,
93
  sd_deleted      BOOLEAN DEFAULT False                   -- [SYNCRO:Deleted]
94
  -- System (tables__generate_missing_fields)
95
  --modified_date TIMESTAMP(0)                            -- [SYNCRO:Modified]
96
);
97
98
-- for tri gram indicies for example on dbupdates
99
-- CREATE EXTENSION IF NOT EXISTS pg_trgm;
100
-- CREATE EXTENSION IF NOT EXISTS btree_gist;
101
102
-- [SYNCRO-TABLE] DBUpdates
103
CREATE TABLE dbupdates
104
 (
105
  upd_id        varchar(30) NOT NULL DEFAULT currenttime()::VARCHAR PRIMARY KEY,  -- [SYNCRO:SyncID] ID des Updates
106
  upd_parent    varchar(30),              -- parent (Baumstruktur)
107
  upd_minver    varchar(11),              -- [SYNCRO:Version] Mindest-Programmversion
108
  upd_kunde     varchar(20),              -- [SYNCRO:Kunde]
109
  upd_donedat   timestamp(0),             -- [SYNCRO:NotThisFields] update eingespielt am
110
  upd_bez       varchar(150) NOT NULL,    -- betreff/bezeichnung
111
  upd_txt       text,
112
  upd_sql       text,
113
  upd_projekt   varchar(100),
114
  upd_noerr     boolean NOT NULL DEFAULT false,
115
  upd_sperr     boolean NOT NULL DEFAULT false,
116
  -- System (tables__generate_missing_fields)
117
  dbrid         varchar(32) NOT NULL DEFAULT nextval('db_id_seq'),
118
  insert_date   date,
119
  insert_by     varchar(32),
120
  modified_by   varchar(32),
121
  modified_date timestamp(0)              -- [SYNCRO:Modified]
122
 );
123
124
 -- CREATE INDEX ON dbupdates USING gist ( dbrid gist_trgm_ops );
125
 -- CREATE INDEX ON dbupdates USING gist ( upd_bez gist_trgm_ops );
126
 -- CREATE INDEX ON dbupdates USING gist ( upd_id gist_trgm_ops );
127
 -- CREATE INDEX ON dbupdates USING gist ( upd_projekt gist_trgm_ops );
128
 CREATE INDEX ON dbupdates (upd_donedat);
129
130
 -- gist index for upd_sql gets to big and fails with
131
 -- ERROR:  index row requires 8304 bytes, maximum size is 8191
132
 -- CREATE INDEX ON dbupdates USING gin  ( upd_sql gin_trgm_ops );
133
134
 CREATE INDEX dbupdates__donedat ON dbupdates ( upd_parent );
135
136
-- Triggerfunktion fürs automatisches Schließen der DB-Updates nach Version
137
CREATE OR REPLACE FUNCTION dbupdates__b_i() RETURNS TRIGGER AS $$
138
  BEGIN
139
    IF EXISTS(SELECT true FROM settings WHERE s_vari = 'DBU_date_for_auto_done') THEN
140
        IF new.upd_id::DATE <= TSystem.Settings__Get('DBU_date_for_auto_done')::DATE THEN
141
            new.upd_donedat:= currenttime();
142
            new.upd_txt:= E'[DBU-AUTO-DONE]\n' || COALESCE(new.upd_txt, '');
143
        END IF;
144
    END IF;
145
146
    RETURN new;
147
  END $$ LANGUAGE plpgsql;
148
149
  CREATE TRIGGER dbupdates__b_i BEFORE INSERT ON dbupdates FOR EACH ROW EXECUTE PROCEDURE dbupdates__b_i();
150
151
152
  CREATE OR REPLACE FUNCTION dbupdates__filtered__nodes__upd_ids__get() RETURNS SETOF VARCHAR AS $$
153
      WITH _nodes AS (
154
            SELECT upd_id FROM dbupdates 
155
             WHERE upd_donedat >= current_timestamp - '90 days'::INTERVAL   
156
                OR upd_donedat IS NULL
157
                OR coalesce(modified_date, insert_date::TIMESTAMP) >= current_timestamp - '90 days'::INTERVAL
158
                OR upd_sperr     
159
           ),
160
           _parents AS (
161
            WITH RECURSIVE _tree AS (
162
                  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)
163
                  UNION
164
                  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   
165
            )
166
            SELECT upd_id FROM _tree
167
             WHERE depth < 0
168
             ORDER BY depth
169
           )
170
           SELECT * FROM _nodes
171
           UNION
172
           SELECT * FROM _parents      
173
  $$ LANGUAGE SQL;
174
</code></pre>
175
176
<pre><code class="sql">
177
--
178
CREATE OR REPLACE FUNCTION tsystem.syncro__dbupdates(IN _dblink VARCHAR DEFAULT 'host=pg.prodat-erp.de port=5432 dbname=PRODAT-18.08 user=syncro password=syncro') RETURNS void AS $$
179
180
  BEGIN
181
182
    SET LOCAL SESSION AUTHORIZATION syncro;
183
184
    DELETE FROM dbupdates;
185
186
    INSERT INTO dbupdates ( upd_id,
187
                            upd_parent,
188
                            upd_minver,
189
                            upd_kunde,
190
                            -- upd_donedat,
191
                            upd_bez,
192
                            upd_txt,
193
                            upd_sql,
194
                            upd_projekt,
195
                            upd_noerr,
196
                            upd_sperr,
197
                            --,
198
                            dbrid,
199
                            insert_date,
200
                            insert_by,
201
                            modified_by,
202
                            modified_date
203
                          )
204
205
    SELECT *
206
      FROM dblink(_dblink,
207
                   'SELECT upd_id,
208
                           upd_parent,
209
                           upd_minver,
210
                           upd_kunde,
211
                           -- upd_donedat,
212
                           upd_bez,
213
                           upd_txt,
214
                           upd_sql,
215
                           upd_projekt,
216
                           upd_noerr,
217
                           upd_sperr,
218
                           --,
219
                           dbrid,
220
                           insert_date,
221
                           insert_by,
222
                           modified_by,
223
                           modified_date
224
                      FROM dbupdates
225
                     WHERE
226
                              upd_kunde IS null
227
                          AND upd_minver <= ' || TSystem.quote_literal__connstr_param( TSystem.Settings__Get( 'ProdatVersion' ) ) || '
228
                  ')
229
        AS ( upd_id        varchar(30),
230
             upd_parent    varchar(30),              -- parent (Baumstruktur)
231
             upd_minver    varchar(11),              -- [SYNCRO:Version] Mindest-Programmversion
232
             upd_kunde     varchar(20),              -- [SYNCRO:Kunde]
233
             -- upd_donedat   timestamp(0),             -- [SYNCRO:NotThisFields] update eingespielt am
234
             upd_bez       varchar(150),
235
             upd_txt       text,
236
             upd_sql       text,
237
             upd_projekt   varchar(100),
238
             upd_noerr     boolean,
239
             upd_sperr     boolean,
240
             -- System (tables__generate_missing_fields)
241
             dbrid         varchar(32),
242
             insert_date   date,
243
             insert_by     varchar(32),
244
             modified_by   varchar(32),
245
             modified_date timestamp(0)              -- [SYNCRO:Modified]
246
           );
247
248
  END $$ LANGUAGE plpgsql;
249
</code></pre>
250
251
<pre><code class="sql">
252 15 [X] Daniel S
DROP TABLE tablefieldinfo;
253 1 [X] Daniel S
254 15 [X] Daniel S
-- Spaltentypen, Defaultwerte und Foreignkeys für Tabellen und Views
255
CREATE TABLE tablefieldinfo
256
 (isView                BOOLEAN DEFAULT false,  -- True für Viewspalten, False für alle Tabellenspalten
257
  isWritable            BOOLEAN DEFAULT false,  -- Für Tabellen immer True, bei Views nur wenn Update und Insert möglich sind
258
  schemaname            VARCHAR(40),            -- Schema der Tabelle / View
259
  tablename             VARCHAR NOT NULL,       -- View oder Tabellenname
260
  index                 SMALLINT NOT NULL,      -- Feldindex (Position in der Tabellendefinition)
261
  field                 VARCHAR NOT NULL,       -- Feldname
262
  type                  VARCHAR,                -- Feldtyp
263
  length                INTEGER,                -- Feldlänge (Nur für varchar)
264
  def                   TEXT,                   -- Defaultwert (Fixwert oder "nextval('name_der_id_sequenz'::regclass)"
265
  foreign_schema        VARCHAR(100),           -- Die Spalte referenziert auf dieses Schema ...
266
  foreign_table         VARCHAR(100),           -- Die Spalte referenziert auf diese Tabelle ...
267
  foreign_column        VARCHAR(50),            -- ... und Spalte
268
  -- System (tables__generate_missing_fields)
269
  --   kein automatisches dbrid, insert_date, insert_by, modified_by, modified_date und table_delete-Trigger (tables__fieldInfo__fetch)
270
  PRIMARY KEY("schemaname","tablename", "index", "field", "isview")
271
 );
272
273
 CREATE INDEX tablefieldinfo_tablename ON tablefieldinfo(tablename);
274
 CREATE INDEX tablefieldinfo_field ON tablefieldinfo(field);
275
276
277 13 [X] Daniel S
278 11 [X] Daniel S
SELECT TSystem.tablefieldinfo__recreate();  
279
280
SELECT TSystem.tables__generate_missing_fields();
281
282
283
284
SELECT TSystem.Settings__Set( 'ProdatVersion', '22.06.23.00' );
285
286
287
CREATE OR REPLACE FUNCTION tsystem.quote_literal__connstr_param(
288
    IN _text varchar
289
  ) RETURNS varchar AS $$
290
  DECLARE
291
    _result varchar;
292
  BEGIN
293
    _result := REPLACE( REPLACE( _text, E'\\', E'\\\\' ), E'\'', E'\\\'');
294
    _result := concat(  '''',
295
                        _result,
296
                        ''''
297
                      );
298
    RETURN _result;
299
  END; $$ LANGUAGE plpgsql;
300
  
301
CREATE EXTENSION IF NOT EXISTS dblink;  
302
303
SELECT tsystem.syncro__dbupdates();
304
305
306
UPDATE dbupdates SET upd_donedat = '1899-01-01' WHERE upd_id IN ('2015-06-01 15:56:01', '2015-11-02 16:47:42', '2016-09-06 12:25:29', '2017-06-08 17:43:29', '2018-06-10 10:09:01', '2018-07-05 16:58:01')
307
</code></pre>
308 16 [X] Daniel S
}}