![]() |
Re: Stored pocedure
Hi Hansa,
Zitat:
tut nicht.... Es gibt aber in FB 1.5 (vielleicht auch IB 7.x?) die Möglichkeit innerhalb einer SP ein beliebiges Statement auszuführen (was allerdings den Sinn einer SP wieder in Frage stellt und zudem ein gewisses Sicherheitsrisiko in sich birgt!). Grüße Lemmy |
Re: Stored pocedure
Hi Lemmy,
gut, daß du auch was dazu sagst. Aber die Idee mit der SP kam von Kiar nicht von mir. :mrgreen: Was ist mit der Trigger-Lösung ? |
Re: Stored pocedure
Zitat:
Den "schönen, großen" Audit würde ich aber bevorzugen und dann natürlich mit neuer tabelle. @kiar: musst nicht zwingend auf FB1.5 wechseln. Es geht auch mit IB dann nur nicht so schön (generische Trigger...) [edit] ein o durch ein ö ersetzt Gruß Ken |
Re: Stored pocedure
@Ken: also doch Trigger ? Nur was meinst Du mit "generischen" Triggern ??
|
Re: Stored pocedure
HAllo Hansa,
klar geht das mit Triggern. Mit Generisch meine ich die Erweiterung der Syntax des FB, daß du jetzt einen Trigger für alle Vorgänge schreiben kannst und dann im Trigger fragst, ob man nun gerade ein insert, update oder delete durchführt. Dafür gibt es seit FB 1.5 die möglichkeit per if abfrage den modus festzustellen
SQL-Code:
Wie genau die Syntax für den Trigger header aussieht musst du in den Release notes mal nachlesen. Wahrscheinlich sowas wie
IF (updating) THEN BEGIN
... END ELSE IF (inserting) THEN...
SQL-Code:
Das mach die Arbeit halt ein bisserl schöner. Ein Trigger anstelle für drei. ;)
CREATE TRIGGER ...
ACTIVE BEFORE INSERT OR UPDATE ... Gruß Ken |
Re: Stored pocedure
ich versteht zwar nicht den sinn folgender zeile
IF (L <> 'NOW') THEN LETZTEAENDERUNG = 'NOW'; aber es geht ja hier um ein variables sql statement. Bei Firebird gibt es hierzu das maechtige feature 'execute statement', damit kann man sowas realisieren. Unter Interbase gibt es das meines wissens nicht (korrigiert mich wenn dem nicht so ist) Hier die Prozedure:
Code:
die systemvariablen now und today sind veraltet, man benutzt künftig besser current_timestamp bzw. current_date
CREATE PROCEDURE HELPME (
TABNAME VARCHAR(32), FIELDNAME VARCHAR(32), ID INTEGER) RETURNS ( LETZTEAENDERUNG TIMESTAMP) AS DECLARE VARIABLE SQL VARCHAR(512); DECLARE VARIABLE L TIMESTAMP; BEGIN EXECUTE STATEMENT 'SELECT ' || FIELDNAME || ' FROM ' || TABNAME || ' WHERE ID = ' || :ID INTO :L; IF (L <> current_timestamp) THEN LETZTEAENDERUNG = current_timestamp; SUSPEND; END [SORRY WAR ZU SCHNELL UND HABE DEN THREAD NICHT BIS ANS ENDE GELESEN; WAR JA ALLES SCHON BEKANNT BIS AUF DIE SACCHE MIT CURRENT_TIMESTAMP] |
Re: Stored pocedure
hallo dephideveloper,
execute Statement geht unter Firebird 1.0 auch nicht, marcel hatte sich darüber schon ausgelassen raik |
Re: Stored pocedure
Hallo all,
mit der Stored procedure wurde erstmal geknickt. interesse meinerseits ist aber da . werde mich mal mit audit trail befassen. habe auch schon einen guten ansatz erhalten. dank dem Spender :mrgreen: es wurde mit BI und AU Triggern realisiert und scheint zu laufen. danke raik |
Re: Stored pocedure
Warum AU?
Dann hast du doch keinen Zugriff mehr auf den ":New Record". Im Endeffekt wäre es bei der von dir gewählten Lösung nix weiter als das:
SQL-Code:
CREATE Table Robert_G.SENT_QUERIES_Audit
(PK_SENT_QUERIES_Aud Integer -- Zusätzliche PK_Spalte ,PROJECT_NO NUMBER(22) ,SUBJECT_ID NUMBER(22) ,SUBJID VARCHAR2(80) ,ERROR_ID NUMBER(22) ,SENT_TO_MONITOR VARCHAR2(60) ,SENT_DATE VARCHAR2(200) ,BACK VARCHAR2(500) ,BACK_DATE VARCHAR2(20))
SQL-Code:
-- Prim Key auf diese Spalte
ALTER Table Robert_G.SENT_QUERIES_audit ADD Primary Key(PK_SENT_QUERIES_Aud) Using Index
SQL-Code:
-- Sequence für den Audit PK
CREATE Sequence Robert_G.SENT_QUERIES_Aud_Seq
SQL-Code:
-- Sequence für den Audit PK
CREATE Trigger Robert_G.SENT_QUERIES_Aud_PK_Trig Before INSERT ON Robert_G.SENT_QUERIES_Audit FOR EACH ROW DECLARE NewID Integer; BEGIN SELECT Robert_G.SENT_QUERIES_Aud_Seq.NextVal INTO NewID FROM Dual; :New.PK_SENT_QUERIES_Aud := NewID; END;
SQL-Code:
Falls du den Code zu IB übersetzen konntest, dürfte er dir das für alle Tabellen des angegeben Users machen. (Audit tabelle & Co erzeugen)
CREATE Trigger Robert_G.SENT_QUERIES_Aud_Trig
Before INSERT Or Update ON Robert_G.SENT_QUERIES FOR EACH ROW BEGIN -- Die 2 Zeilen klappen nur mit einem BU Trigger :New.EditDate := SysDate; :New.EditUser := User; If UPDATING Then INSERT INTO Robert_G.SENT_QUERIES_Audit VALUES ( null ,:Old.PROJECT_NO ,:Old.SUBJECT_ID ,:Old.SUBJID ,:Old.ERROR_ID ,:Old.SENT_TO_MONITOR ,:Old.SENT_DATE ,:Old.BACK ,:Old.BACK_DATE); End If; END; Das da oben wurde aus einer Tabellenleiche von vorgestern, die noch in meinem User lag, erzeugt. |
Re: Stored pocedure
Doch doch, Robert. Die Trigger gehen schon so, wie Kiar gesagt hat. :shock: Und das ganze auch noch in einem Audit aufzuzeichnen ist kein Problem mehr.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:43 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