Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Stored pocedure (https://www.delphipraxis.net/22420-stored-pocedure.html)

Lemmy 19. Mai 2004 11:13

Re: Stored pocedure
 
Hi Hansa,

Zitat:

Zitat von Hansa

Jetzt ist nur noch die Frage, wie man solch eine Prozedur Feld/Tabellen- unabhängig machen kann.


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

Hansa 19. Mai 2004 12:21

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 ?

CenBells 19. Mai 2004 12:34

Re: Stored pocedure
 
Zitat:

Zitat von Robert_G
@CenBells
Dein Vorschlag wäre im endeffekt das, was ich als "billige Lösung" vorgeschlagen habe, nur das die Felder
SQL-Code:
Created_date Timestamp Not Null,
Created_By Integer Not Null, -- oder auch String
sinnlos sind.
In der aktiven Tabelle steht der User & das Datum der letzten Änderung, im Audit wäre der Eintrag mit der kleinsten Audit ID zu dieser PK der Eintrag mit dem "Erzeuger". Dabei fällt mir auf: Auch das Audit bräuchte natürlich einen PK.

Jop, das ist die billige lösung, aber warum sind die felder sinnlos, bzw was genau meinst du mit aktiver tabelle? So benötigt man keine eigene neue tabelle und hat die informationen direkt parat... Ist wohl geschmackssache..
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

Hansa 19. Mai 2004 12:40

Re: Stored pocedure
 
@Ken: also doch Trigger ? Nur was meinst Du mit "generischen" Triggern ??

CenBells 19. Mai 2004 13:04

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:
IF (updating) THEN BEGIN
   ...
  END
  ELSE IF (inserting) THEN...
Wie genau die Syntax für den Trigger header aussieht musst du in den Release notes mal nachlesen. Wahrscheinlich sowas wie
SQL-Code:
CREATE TRIGGER ...
 ACTIVE BEFORE INSERT OR UPDATE ...
Das mach die Arbeit halt ein bisserl schöner. Ein Trigger anstelle für drei. ;)

Gruß
Ken

DelphiDeveloper 19. Mai 2004 14:28

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:
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
die systemvariablen now und today sind veraltet, man benutzt künftig besser current_timestamp bzw. current_date

[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]

kiar 19. Mai 2004 14:36

Re: Stored pocedure
 
hallo dephideveloper,

execute Statement geht unter Firebird 1.0 auch nicht, marcel hatte sich darüber schon ausgelassen

raik

kiar 21. Mai 2004 18:19

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

Robert_G 21. Mai 2004 19:02

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:
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;
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)

Das da oben wurde aus einer Tabellenleiche von vorgestern, die noch in meinem User lag, erzeugt.

Hansa 21. Mai 2004 19:12

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 07:26 Uhr.
Seite 4 von 4   « Erste     234   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz