Projekt

Allgemein

Profil

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

[X] Daniel S, 16.05.2023 13:46

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