Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Hat Trigger kein Before? (https://www.delphipraxis.net/12849-hat-trigger-kein-before.html)

Nalincah 5. Dez 2003 08:39


Hat Trigger kein Before?
 
Kann es sein das die Trigger in der SAP DB 7.4 nur AFTER kenn und nicht BEFORE?

KLAPPT:

SQL-Code:
CREATE TRIGGER AUTOINCADR FOR admin.ADRESSEN AFTER INSERT EXECUTE
(
  SELECT ADRESS_ID FROM ADMIN.ADRESSEN ORDER BY ADRESS_ID ASC;
  INSERT INTO ADMIN.ADRESSEN (ADRESS_ID) VALUES ('test');
)
KLAPPT NICHT:

SQL-Code:
CREATE TRIGGER AUTOINCADR FOR admin.ADRESSEN BEFORE INSERT EXECUTE
(
  SELECT ADRESS_ID FROM ADMIN.ADRESSEN ORDER BY ADRESS_ID ASC;
  INSERT INTO ADMIN.ADRESSEN (ADRESS_ID) VALUES ('test');
)
[edit=Admin]SQL-Statements in Tags [ sql] und [ /sql] gesteckt. Bitte künftig selber machen. Danke. ;-) Mfg, Daniel[/edit]

Robert_G 5. Dez 2003 09:26

Re: Hat Trigger kein Before?
 
in SAP DB scheint das der Fall zu sein.
In ihrer Syntaxdefinition eines Triggers steht explizit nur "AFTER":
Zitat:

Syntax

<create_trigger_statement> ::= CREATE TRIGGER <trigger_name> FOR <table_name>
AFTER <trigger_event,..> EXECUTE (<routine>) [WHENEVER <search_condition> ]

<trigger_event> :: INSERT | UPDATE [(<column_list>)] | DELETE
<column_list> ::= <column_name> | <column_list>,<column_name>

Nalincah 5. Dez 2003 09:35

Re: Hat Trigger kein Before?
 
Verdammt.
AFTER INSERT wird erst ausgeführt nachdem der Datensatz gespeichert ist?

Dann hätt ich ein Problem: Will nämlich das, wenn man einen neuen Datensatz anlegt, der Trigger automatisch das feld ADRESS_ID (PrimayKey, NotNull) mit dem nächsten fortlaufenden Wert füllt. Das Problem ist, solange da nichts drin steht kann ich nicht speichern, und solange ich nicht speichern kann, steht da nichts drin (Der Trigger wird ja erst nach dem Speichern ausgeführt). Seh ich das richtig?

Hansa 5. Dez 2003 10:36

Re: Hat Trigger kein Before?
 
Die Argumente für Interbase werden (zumindest für mich) immer offensichtlicher. Da habe ich 6 Trigger zur Auswahl. Jeweils INSERT, UPDATE und DELETE für AFTER und BEFORE. Ähnlich siehts mit Views und SP aus. Soweit ich weiß, hat MS-SQL nur drei Trigger. Und SAP baut darauf auf. ADS z.B. hat zumindest in der freien Version nicht mal Transaktionen.

Nalincah 5. Dez 2003 10:42

Re: Hat Trigger kein Before?
 
Was ist ADS?

Nalincah 5. Dez 2003 11:23

Re: Hat Trigger kein Before?
 
Was ist an diesem Statement falsch?

Delphi-Quellcode:
CREATE TRIGGER AutoIncAdresse FOR admin.ADRESSEN AFTER INSERT EXECUTE
(
    IF :new.ADRESS_ID IS NULL THEN
        SELECT MAX(ADRESS_ID) + 1 INTO :new.ADRESS_ID FROM admin.ADRESSEN
    ELSE
    IF :new.ADRESS_ID <= 0 THEN
        SELECT MAX(ADRESS_ID) + 1 INTO :new.ADRESS_ID FROM admin.ADRESSEN
    ENDif;
    IF :new.ADRESS_ID IS NULL THEN
      :new.ADRESS_ID := 1;
    ENDIF;
)
Das krieg ich als meldung:

Delphi-Quellcode:
---- Error -------------------------------
Auto Commit: On, SQL Mode: Internal, Isolation Level: Committed
General error;-7045 POS(80) Parameter spec not allowed.
CREATE TRIGGER AutoIncAdresse FOR admin.ADRESSEN AFTER INSERT EXECUTE
(
    IF :new.ADRESS_ID IS NULL THEN
        SELECT MAX(ADRESS_ID) + 1 INTO :new.ADRESS_ID FROM admin.ADRESSEN
    ELSE
    IF :new.ADRESS_ID <= 0 THEN
        SELECT MAX(ADRESS_ID) + 1 INTO :new.ADRESS_ID FROM admin.ADRESSEN
    ENDif;
    IF :new.ADRESS_ID IS NULL THEN
      :new.ADRESS_ID := 1;
    ENDIF;
)
Wobei das ":new.ADRESS_ID" (Erste Zeile) rot geschrieben da steht. Geh mal davon aus da da der Fehler liegt

Hansa 5. Dez 2003 11:23

Re: Hat Trigger kein Before?
 
Ist das jetzt wichtig ? Advanced Database Systems, eine Datenbank.

MyRealName 5. Dez 2003 11:35

Re: Hat Trigger kein Before?
 
Ich hab mich auch für Interbase (respektive FireBird) entschieden, weil sie

a) 6 Trigger haben
und
b) UDF's unterstützen, die leicht zu programmieren sind.

und ich bin seit über 4 Jahren SEHR glücklich damit !

LG, MRN

Nalincah 5. Dez 2003 11:38

Re: Hat Trigger kein Before?
 
ich kann mir die DB leider nicht aussuchen

Robert_G 5. Dez 2003 11:43

Re: Hat Trigger kein Before?
 
Der Link,den ich dir gestern gepostet habe enthät alle Infos, die du zum erstellen von Triggern benötigst.
Die schreiben dort z.B:
Zitat:

:NEW and :OLD must always be used with a colon in SQL statements that are used in triggers and that belong to the routine_sql_statements
(For example: UPDATE reisen.raum SET hnr = :NEW.hnr WHERE hnr = :OLD.hnr).

NEW and OLD must always be used without a colon in SQL statements that are used in triggers and that do not belong to the routine_sql_statements
(For example: IF NEW.hnr <> OLD.hnr).
Du musst also die New/Old Records in SQL-Statements als Bind-Variable (:New/:Old) verwenden.
Im Trigger-code darfst du keinen ":" davor schreiben.

p.s.: bis jetzt konnte ich fast jede deiner Fragen beantworten indem ich 2 Minuten auf dieser Seite gesucht habe.
Und ich habe keinen blassen Schimmer von SAP DB!
Mach dich dort mal schlau, außerdem hat dir MyRealName in deinem "SQL Trigger Tut" -thread diesen Link gepostet SAP DB Forum.

Versteh' mich nicht falsch, aber erst suchen dann fragen. :roteyes:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:16 Uhr.
Seite 1 von 2  1 2      

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