Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Trigger Turorial (https://www.delphipraxis.net/12660-sql-trigger-turorial.html)

Nalincah 2. Dez 2003 08:05


SQL Trigger Turorial
 
Weiß einer von euch wo ich ein gutes Tutorial für SQL Trigger finde?

MyRealName 2. Dez 2003 10:57

Re: SQL Trigger Turorial
 
kommt immer drauf an, mit welcher Db Du arbeitest.

MS SQL Server hat zum Bsp. nur 3 Trigger, Interbase/FireBird wartet mit 6 auf.

Einer ist für INSERT (Before & After Insert), dann UPDATE und DELETE...
Ansonsten kannst im Trigger wie in einer SP programmieren. zusätzlich gibt Dir die DB noch möglichkeiten, herauszubekommen, was geändert wurde. Bei MS SQL gibt es (wenn ich mich recht entsinne !) 2 Tabellen (Deleted & Inserted, bei Update mußt Du 'ne Kombination von beidem nehmen, da bei update der DS delted wird und dann inserted). FireBird stellt die Variablen "New" und "OLD" zur Verfügung

Nalincah 2. Dez 2003 11:07

Re: SQL Trigger Turorial
 
Das ist ne SAP DB 7.4 Datenbank

Hab diese Trigger mal mit ner Access-DB gemacht:

Delphi-Quellcode:
CREATE OR REPLACE TRIGGER personal_log_t
  AFTER INSERT OR UPDATE OR DELETE ON Felder
  DECLARE
    dmltype VARCHAR2(1);
  BEGIN
    IF INSERTING THEN
      dmltype := 'I';
      INSERT INTO felder ( Cat_Tab )
      VALUES ( dmltype );
  END IF;
END;

CREATE TRIGGER FelderTabs FOR Felder AFTER UPDATE EXECUTE (
  AFTER INSERT ON Felder
  BEGIN
    IF INSERTING THEN
      INSERT INTO Tabs ( Cat_Tab ) VALUES ("Insert");
  END IF;
)

CREATE TRIGGER test FOR Felder BEFORE INSERT AS
BEGIN
  INSERT INTO Tabs (Cat_Tab) Values ("Test");
END;
Aber da sagt der immer

Code:
Syntaxfehler in CREATE TABLE-Anweisung
Liegt das an der DB?

r_kerber 2. Dez 2003 11:15

Re: SQL Trigger Turorial
 
Zitat:

Zitat von General2003
Hab diese Trigger mal mit ner Access-DB gemacht
...
Code:
Syntaxfehler in CREATE TABLE-Anweisung
Liegt das an der DB?

Zitat:

Zitat von MyRealName
kommt immer drauf an, mit welcher Db Du arbeitest.

Ob Access wohl keine Trigger kennt? In der OH findet man nur CREATE TABLE und CREATE INDEX.

MyRealName 2. Dez 2003 12:02

Re: SQL Trigger Turorial
 
Access kennt (IMHO !) keine Trigger. Bei SAP muß ich passen. Aber es gibt sicherlich ne gute Doku zu SAP, schau doch mal rein, was Du da zum Erstellen von Triggern brauchst und welche Anweisungen innerhalb des Triggers gültig sind.

MyRealName

Nalincah 2. Dez 2003 14:11

Re: SQL Trigger Turorial
 
Ich hab mal in ner SAP DB 7.4 DB mal folgendes ausprobiert:

Hab ne Tab "Einheiten" mit nem Feld "EINHEIT_ID"
Will jetzt das der, wenn ich das feld ändere (Update) das Statement "select * from artikel ausführt:

Delphi-Quellcode:
create trigger test on einheiten for update as
if update(EINHEIT_ID)
begin
  select * from artikel;
end;
Aber der sagt immer:

Delphi-Quellcode:
[SAP AG][SQLOD32 DLL][SAP DB]Syntax error or access violation;-3014 POS(21) Invalid end of SQL statement

MyRealName 2. Dez 2003 19:46

Re: SQL Trigger Turorial
 
naja, wie gesagt, kenn SAP DB ned, aber kann es sein, daß es vielelicht sehr restriktiv ist und erwartet, daß Du damit was anfängst ? Bei FireBird/Interbase sähe das so aus

begin
For SELECT * FROM Artikel INTO :Var1, :Var2 Do
begin
/* Do something */
end
end

Vielelicht hilft Dir das, ansonsten in der Doku zu SAP nachschauen, was der Fehler ist (und was die Fehlernummer bedeutet).

MyRealName

Nalincah 3. Dez 2003 10:00

Re: SQL Trigger Turorial
 
Hab nochmal ein bisschen ausprobiert! Kann irgendwer mit dieser Fehlermeldung was anfangen?

Code:
Ein Parameterobjekt ist nicht ordnungsgemäß definiert. Inkonsistente oder unvollständige Informationen wurden angegeben
Das kam nachdem ich das in ner SAP DB-Datenbank ausführen wollte:


Delphi-Quellcode:
DROP TABLE SALS;
CREATE TABLE SALS
        (JOB VARCHAR2(9) primary key,
         MINSAL NUMBER(7,2),
         MAXSAL NUMBER(7,2)
        );

INSERT INTO SALS VALUES ('CLERK', 800, 1300);
INSERT INTO SALS VALUES ('ANALYST', 3000, 3500);
INSERT INTO SALS VALUES ('SALESMAN', 1250, 1600);
INSERT INTO SALS VALUES ('MANAGER', 2450, 2975);
INSERT INTO SALS VALUES ('PRESIDENT', 5000, 5500);

create or replace trigger check_salary_EMP
after insert or update of SAL, JOB on EMP
for each row
when (new.JOB != 'PRESIDENT')
declare
   minsal number;
   maxsal number;
begin
   -- retrieve minimum and maximum salary for JOB
   select MINSAL, MAXSAL into minsal, maxsal from SALS
   where JOB = :new.JOB;
   -- If the new salary has been decreased or does not lie
   -- within the salary range raise an exception
   if :new.SAL < minsal or :new.SAL > maxsal then
      raise_application_error(-20225, 'Salary range exceeded');
   elsif :new.SAL < :old.SAL then
      raise_application_error(-20230, 'Salary has been decreased');
   elsif :new.SAL > 1.1*:old.SAL then
      raise_application_error(-20235, 'More than 10% salary increase');
   end if;
end;

MyRealName 3. Dez 2003 12:24

Re: SQL Trigger Turorial
 
ich leider ned, kenne de SAP-Syntax überhaupt ned :(
Sorry

Robert_G 3. Dez 2003 13:38

Re: SQL Trigger Turorial
 
Also ersteinmal.
Glückwunsch - du arbeitest dort mit 'ner ORACLE DB! :bouncing4:

Die Syntax ist eindeutig Oracle genau wie die vorinstalltierten tabellen, die du verwendest.
Meldest du dich als Scott /passwort Tiger an?
Wenn nicht dann solltest du vor deine Tabellen noch ein "scott." tippen, sonst wird die DB die tabellen nicht finden können.

Vielleicht irre mich ja, aber das wäre einfach ein zu krasser Zufall.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:50 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