2009-07-14 2 views
1

ich einen Trigger in PostgreSQL 8.2 bin mit einer Tabelle Änderungen zu prüfen:Wie kann ich einen Benutzernamen für einen Postgresql-Audit-Trigger festlegen?

CREATE OR REPLACE FUNCTION update_issue_history() RETURNS trigger as $trig$ 
BEGIN 
     INSERT INTO issue_history (username, issueid) 
       VALUES ('fixed-username', OLD.issueid); 
     RETURN NULL; 
END; 
$trig$ LANGUAGE plpgsql; 

CREATE TRIGGER update_issue_history_trigger 
AFTER UPDATE ON issue 
     FOR EACH ROW EXECUTE PROCEDURE update_issue_history(); 

Was ich will ist irgendwie zu tun hat, den Wert von fixed-username an der Zeit, dass ich das Update ausführen zu liefern. Ist das möglich? Wenn ja, wie kann ich es erreichen?

+0

mögliches Duplikat von [Passender Benutzer ID zu PostgreSQL-Triggern] (http://stackoverflow.com/questions/13172524/passing-user-id-to-postgresql-triggers) –

+0

Die Antwort [hier] [1] fasst es ziemlich gut zusammen. [1]: http://stackoverflow.com/a/13172964/947357 –

+0

8.2? Bitte lesen Sie http://www.postgresql.org/support/versioning/ und beginnen Sie mit der Planung Ihres Upgrades. –

Antwort

0

versuchen, etwas wie folgt aus:

CREATE OR REPLACE FUNCTION update_issue_history() 
RETURNS trigger as $trig$ 
DECLARE 
     arg_username varchar; 
BEGIN 
     arg_username := TG_ARGV[0]; 
     INSERT INTO issue_history (username, issueid) 
      VALUES (arg_username, OLD.issueid); 
     RETURN NULL; 
END; 
$trig$ LANGUAGE plpgsql; 

CREATE TRIGGER update_issue_history_trigger 
AFTER UPDATE ON issue 
     FOR EACH ROW EXECUTE PROCEDURE update_issue_history('my username value'); 
0

Ich sehe keinen Weg, um dieses andere zu tun, als temporäre Tabellen zu erstellen und in Ihrem Execute Trigger verwenden. Dies wird jedoch Auswirkungen auf die Leistung haben. Eine bessere Option wäre, irgendwo in eine andere Tabelle einzubinden und sich anzumelden, wer sich per Sitzungs-ID und Back-End-PID an-/abmeldet und darauf verweist?

Hinweis: Sie haben keine andere Möglichkeit, die Informationen in die Update-Anweisung zu übernehmen. Beachten Sie, dass der Auslöser nur sehen kann, was in der API oder in der Datenbank verfügbar ist. Wenn Sie möchten, dass ein Trigger transparent arbeitet, können Sie nicht erwarten, dass er zur Laufzeit Informationen an ihn weitergibt, auf die er sonst keinen Zugriff hätte.

Die grundlegende Frage, die Sie stellen müssen, ist "Wie weiß die dB, was man dort setzt?" Sobald Sie sich für eine Methode entscheiden, sollte die Antwort klar sein, aber es gibt keine kostenlosen Mittagessen.

aktualisieren

In der Vergangenheit, als ich hatte, so etwas zu tun, wenn die Anmeldung an die DB mit einer Anwendungsrolle ist, die Art, wie ich es getan haben ist eine temporäre Tabelle zu erstellen und dann den Zugriff diese Tabelle aus den gespeicherten Prozeduren. Gegenwärtig gespeicherte Prozeduren können auf diese Weise temporäre Tabellen verarbeiten, aber in der Vergangenheit mussten wir EXECUTE verwenden.

Es gibt zwei große Einschränkungen bei diesem Ansatz. Die erste ist, dass es eine Menge Tabellen erstellt und dies schließlich zu der Möglichkeit der Oid-Wraparound führt.

In diesen Tagen bevorzuge ich die Logins für die db als Benutzer Logins. Dies macht das viel einfacher zu verwalten und Sie können Zugang nur über den Wert SESSION_USER (ein Neuling Fehler ist CURRENT_USER zu verwenden, die Sie den aktuellen Sicherheitskontext zeigt statt der Anmeldung des Benutzers.

Keiner dieser Ansätze funktionieren gut mit Verbindungspooling Im ersten Fall können Sie kein Verbindungspooling durchführen, da Ihre temporären Tabellen falsch interpretiert oder geplottert werden, im zweiten Fall nicht, da die Login-Rollen unterschiedlich sind

Verwandte Themen