![]() |
Datenbank: Firebird • Version: 1.5 • Zugriff über: FIBPlus
User identifizieren
Hallo miteinander.
Ich habe ein programm, welches mit einer Firebird-DB zusammenarbeitet. Nun möchte ich, quasi aus Sicherheitsgründen, bestimmte Aktionen mitprotokollieren. So frei nach dem Motto "welcher User löscht/ändert wann was an welcher Tabelle". Aus diesem Grunde habe ich mir ein paar Trigger geschrieben, welche diese Protokollfunktion übernehmen und entsprechende Daten in eine separate Tabelle schreiben. Mein Problem ist jetzt folgendes: Nicht für jeden User, der sich am Programm anmeldet, ist ein eigener DB-user angelegt, vielmehr erfolgt die Rechte-Verwaltung im Programm. Wie kann ich jetzt datenbankseitig erkennen, welcher User sich gerade hier zu schaffen macht? "CURRENT_USER" geht ja hier nicht wirklich... |
Re: User identifizieren
Hallo Jan,
das ist unter FB 1.5 mit ein wenig Aufwand verbunden (FB2 soll besser werden) aber mit CURRENT_CONNECTION lösbar. Das Programm muß sicherstellen, daß nach dem CONNECT ein Eintrag in die Tabelle z.B. "BENUTZER", mit mindestens den Feldern Benutzername und CONNECTION_ID, erfolgt. Dh. wenn schon ein Eintrag mit diesem Benutzer existiert dann wird nur die CONNECTION_ID upgedated (schönes Wort) wenn nicht, dann ein Insert mit Benutzername+CONNECTION_ID. Das läßt sich am besten mit einer SP lösen. Die Protokoll-Tabelle erhält einen Before-Insert-Trigger. Über die Variable CURRENT_CONNECTION wird in der Benutzertabelle der Eintrag mit der passenden CONNECTION_ID gesucht und der dazugehörenden Benutzername in die Protokoll-Tabelle eingetragen. Damit muß man nur noch die zu protokollierenden Daten in die Protokoll-Tabelle eintragen. Der Benutzer wird automatich hinzugefügt. alex |
Re: User identifizieren
Zwischenfrage hierzu :
Zitat:
|
Re: User identifizieren
Danke. Wenn dieser Wert gleich bleibt, solang eine Verbindung besteht, ist CURRENT_CONNECTION genau das, sein was ich gesucht habe.
|
Re: User identifizieren
Über Kontextvariable CURRENT_CONNECTION kann nicht auf einen User geschlossen werden, da sie nur währeend einer Verbindung gültig ist.
In Firebird 2 wurden neue Kotextvariablen eigeführt. U.A. gibt es neue Kontextvariable CLIENT_ADDRESS im Bereich SYSTEM, welche die IP des Clientrechners enthält oder im Bereich 'USER_SESSION' die Variable APP_LOGIN.
SQL-Code:
select RDB$get_context( 'SYSTEM', 'CLIENT_ADDRESS');
|
Re: User identifizieren
Zitat:
Tabelle? mit
SQL-Code:
SP? mit
CREATE TABLE APP$BENUTZER ....
SQL-Code:
und gleich nach dem Connect SP_APP$LOGIN ausführen.
CREATE PROCEDURE SP_APP$LOGIN (
USER_KUERZEL VARCHAR(10), USER_NAME VARCHAR(40), USER_LOCATION VARCHAR(40)) RETURNS ( USER_ID INTEGER, CONNECT_ID INTEGER, CONNECT_RESULT INTEGER) AS ... alex |
Re: User identifizieren
Zitat:
alex |
Re: User identifizieren
Ich bräuchte eher den Rumpf von der SP, nicht den Kopf. :mrgreen: Wo kriege ich denn die richtigen Rückgabewerte her ?
|
Re: User identifizieren
Zitat:
|
Re: User identifizieren
Zitat:
SQL-Code:
So siehts jetzt bei mir aus. Meine Tabelle USERLOG enthält nur USERID (wegen eigener Userverwaltung, da gibbet eindeutige IDs) und CONNID.
CREATE PROCEDURE LOG_USER(USER_ID INTEGER)
AS DECLARE VARIABLE ANZ INTEGER; BEGIN SELECT COUNT(USERID) FROM USERLOG WHERE USERID = :USER_ID INTO :ANZ; IF(ANZ = 0) THEN INSERT INTO USERLOG (USERID, CONNID) VALUES (:USER_ID, CURRENT_CONNECTION); ELSE UPDATE USERLOG SET CONNID = CURRENT_CONNECTION WHERE USERID = :USER_ID; END Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz