Ich möchte gerne (Teile) der Informationen aus Systemview QSYS2.USER_INFO nutzen. Bislang haben wir in einem Nachtlauf eine Datei aufgebaut, mit der Konsequenz veraltete Daten zu haben.
Charmant wäre es, aktuelle Daten wie letzten Login PREVIOUS_SIGNON zu erhalten.
Dazu wollte ich eine UDF nutzen, welche mit *OWNER umgewandelt wird:
Code:
CREATE FUNCTION obj.GetUsrInfo()
RETURNS TABLE
(
 AUTHORIZATION_NAME VARCHAR(10),
 PREVIOUS_SIGNON TIMESTAMP,
 SIGN_ON_ATTEMPTS_NOT_VALID INTEGER,
 STATUS VARCHAR(10),
… usw ...
 CREATION_TIMESTAMP TIMESTAMP,
 LAST_USED_TIMESTAMP TIMESTAMP,
 DAYS_USED_COUNT INTEGER,
 LAST_RESET_TIMESTAMP TIMESTAMP
)
LANGUAGE SQL READS SQL DATA
SET OPTION USRPRF=*OWNER
BEGIN
RETURN select * from qsys2.user_info;
END;
Die Abfrage wäre dann wie folgt: SELECT * FROM TABLE(hgwobj.GetUsrInfo()) x where x.status='*DISABLED';

  1. Die View der USER_INFO greift auch wieder nur auf eine Funktion zu mit Parametern, gefühlt wird die Variante mit noch einer UDF langsamer. Für eine Abfrage wie oben mit SELECT ist es initial 8 Sekunden!
  2. Wenn ich direkt den SELECT mit meinen niedrigen User-Rechten ausführe, sehe ich immerhin 112 der 1500 Userprofile. Woran liegt das?
  3. Gibt es eine elegantere Variante den Zugriff auf z.B. eine Teilmenge zuzulassen Berechtigungen aufweichen / Column Access - Hier bitte Vorschläge - am liebsten wäre mir, ich könnte wenn aus Gründen der Systemsicherheit und Updatefähigkeit (Zugriff/Abhängigkeit/Locks auf Systemtable?) keine Problme auftreten. Ich kenne keine andere Variante wie die UDF bislang.
  4. Müssen für die UDF alle Spalten per Hand angegeben werden? Ich hab mir zwar mit Excel eine Hilfe anhand der Syscolumns gebaut, aber einfacher wäre natürlich anhand des SELECTS den DatenTyp zu ermitteln
  5. Wäre hier eine MQT für die Performante Abfrage eine Lösung - wie sieht es hier mit dem Refresh und der Berechtigung aus - brauche ich dann z.B. eine Stored Procedure mit *OWNER oder "schafft" die MQT das selbst per AutoUpdate (gibt ja zwei Modi *DEFFERED u. noch einen anderen)
  6. Bei der Abfrage mit SELECT * FROM TABLE(hgwobj.GetUsrInfo()) x where x.authorization_name='HUGO';kommt eine Fehlermeldung - allerdings weiß ich nicht warum. Beim Feld Status='*DISABLED' in der WHERE-CLAUSE kommt kein Fehler, Ändere ich den Status = 'TEST' kommt wieder eine Fehlermeldung. Im Joblog sehe ich folgendes:
    PHP-Code:
    Ursache  . . . . :  Beim Aufrufen der benutzerdefinierten Funktion GETUSRINFO in Bibliothek OBJ ist ein Fehler aufgetretenDer Fehler trat beim Aufrufen des zugeordneten externen Programms oder Serviceprogramms GETUSRINFO in Bibliothek OBJProgrammeingangspunkt bzwexternem Namen GETUSRINFO_1spezieller Name GETUSRINFOaufDer Fehler trat bei Teildatei QSQPTABL Datei QSQPTABL in Bibliothek QSYS2 aufDer Fehlercode ist 1. Fehlercodes und ihre Bedeutung:      -- Das externe Programm oder Serviceprogramm hat SQLSTATE 22012 zurückgegeben. Die vom Programm zurückgegebene Textnachricht istFehler bei Datenumsetzung oder beim Zuordnen von Daten. . 

    Laut dem Link https://www.ibm.com/support/knowledg...atevalues.html ist das eine Division bei Zero Exception.

    Ein andere Joblog Eintrag sagt
    Code:
    Ursache . . . . : Bei dem Versuch, einen Wert an die Variable SQL_RETURN.USER_ID_NUMBER in einer Anweisung FETCH, einer eingebetteten Anweisung SELECT, einer Anweisung CALL, SET, SET DESCRIPTOR oder VALUES INTO zurückzugeben, ist ein Fehler der Art 1 aufgetreten. Mögliche Fehlerarten sind: -- Fehlerart 1 - Überlauf. -- Fehlerart 2 - Gleitkommaüberlauf. -- Fehlerart 3 - Gleitkommaunterlauf. -- Fehlerart 4 - Gleitkommaumsetzungsfehler. -- Fehlerart 5 - Ungenaues Ergebnis. -- Fehlerart 6 - Ungültige numerische Daten. -- Fehlerart 7 - Ungültige DBCS-Daten. Die relative Position der Variablen ist 52. Ist der Name der Variablen *N, wurde in der Anweisung FETCH oder CALL ein Deskriptorbereich angegeben. Fehlerbeseitigung: Die Größe und ggf. die Art der Variablen oder des Eintrags im Deskriptorbereich so ändern, dass der Ergebniswert hineinpasst, oder die ungültigen Daten korrigieren. Die Anforderung wiederholen.


Freue mich auf eure Fragen/Antworten.