Projekt

Allgemein

Profil

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

[X] Daniel S, 10.05.2023 11:09

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