Postgres96 Kompatibilität Vacuum art Ereignis Eventlog » Historie » Revision 3
Revision 2 ([S] Dominik G, 03.09.2018 09:56) → Revision 3/4 ([S] Dominik G, 03.09.2018 09:59)
h1. Postgres96 Kompatibilität Vacuum art Ereignis Eventlog * Postgres 96 hat keine public search_path mehr * Permanente Fehler in Windows Ereignisanzeige, wenn man ältere PRODAT-Versionen mit Postgres 9.6 betreibt <pre> <@-2018-08-25 11:44:48 CEST> ERROR: function getsetting(unknown) does not exist at character 8 <@-2018-08-25 11:44:48 CEST> HINT: No function matches the given name and argument types. You might need to add explicit type casts. <@-2018-08-25 11:44:48 CEST> QUERY: SELECT GetSetting('akindex') <@-2018-08-25 11:44:48 CEST> CONTEXT: PL/pgSQL function public.artikel_index(character varying) line 7 at assignment automatic analyze of table "BUECHEL-HOLDING-LIVE.public.art" </pre> Bugfix zur Kompatibilität: (es steht nur public davor) <pre><code class="sql"> CREATE OR REPLACE FUNCTION public.getsetting(character varying) RETURNS VARCHAR AS $$ DECLARE r VARCHAR; BEGIN SELECT s_inha INTO r FROM public.settings WHERE s_vari=$1; RETURN COALESCE(r, ''); END$$LANGUAGE plpgsql; DROP INDEX IF EXISTS artikel_index; DROP INDEX IF EXISTS artikel_index_like; DROP INDEX IF EXISTS artikel_index_no_searchstring; DROP INDEX IF EXISTS artikel_index_no_searchstring_like; DROP FUNCTION IF EXISTS artikel_index(VARCHAR); -- Gibt Artikelnummer ohne Index zurück. Wenn Suchstring true, dann mit % am Ende, für Suche aller Artikel unabhängig des Index'. CREATE OR REPLACE FUNCTION artikel_index(IN ak_nr VARCHAR, IN searchstring BOOLEAN DEFAULT true) RETURNS VARCHAR AS $$ DECLARE aknr VARCHAR; indexchar VARCHAR; posindexchar INTEGER; BEGIN indexchar:= public.GetSetting('akindex'::VARCHAR); IF COALESCE(indexchar, '') = '' THEN RETURN ak_nr; END IF; -- Kein IndexChar definiert, dann raus. IF StrPos(ak_nr, '%') > 0 THEN RETURN ak_nr; END IF; -- Wildcard für Suche in Artikel, dann raus. IF StrPos(ak_nr, 'Ø') > 0 THEN RETURN ak_nr; END IF; -- Artikel mit Durchmesserzeichen (Material), dann raus. posindexchar:= StrPos(reverse(ak_nr), indexchar); IF (posindexchar = 0) OR (posindexchar > 3) THEN RETURN ak_nr; END IF; -- Kein Index in Artikelnummer, dann raus. IF posindexchar = 1 THEN -- Indextrenner ist letztes Zeichen, dass heißt der Index ist eingerahmt vom Trenner, z.B. 123'A'. posindexchar:= StrPos(reverse(SubStr(ak_nr, 1, Length(ak_nr)-1)), indexchar) + 1; END IF; aknr:= SubStr(ak_nr, 1, public.IFTHEN(ak_nr IFTHEN(ak_nr LIKE '%' || indexchar || '%', Length(ak_nr) - posindexchar, 100)::INTEGER); IF searchstring THEN -- Wenn Suchstring gewünscht, dann anhängen. aknr:= aknr || indexchar || '%'; ELSE aknr:= rtrim(aknr); -- sonst nur störende Leerzeichen rechts entfernen. END IF; RETURN aknr; END $$ LANGUAGE plpgsql IMMUTABLE; -- nur IMMUTABLE, wenn GetSetting('akindex') sich nicht ändert. -- -- Indizes neu CREATE INDEX artikel_index ON art (artikel_index(ak_nr)); -- 2. Parameter searchstring DEFAULT true CREATE INDEX artikel_index_like ON art (artikel_index(ak_nr) varchar_pattern_ops); -- 2. Parameter searchstring DEFAULT true CREATE INDEX artikel_index_no_searchstring ON art (artikel_index(ak_nr, false)); CREATE INDEX artikel_index_no_searchstring_like ON art (artikel_index(ak_nr, false) varchar_pattern_ops); -- </code></pre>