Projekt

Allgemein

Profil

Postgres96 Kompatibilität Vacuum art Ereignis Eventlog » Historie » Revision 2

Revision 1 ([X] Daniel S, 25.08.2018 11:58) → Revision 2/4 ([S] Dominik G, 03.09.2018 09:56)

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, 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>