Trigger erstellen

Advantage Database Server

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Trigger erstellen

Beitrag von Manfred »

Hi,
ich stelle gerade ein paar Versuche an und komme da nicht so recht weiter. Ich erstelle ein DD mit ADT Tabellen und möchte natürlich direkt auch eine UID automatisch vergeben, wenn ein neuer Satz erfasst wird. Joachims Video vom Treffen in 2016 hilft mir da leider nicht weiter. Wie bekomme ich einen Trigger erstellt, wenn ich alles händisch über den Architekten anlege?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Trigger erstellen

Beitrag von nightcrawler »

am besten über SQL:

Code: Alles auswählen

create trigger trig_ins on [meine Tabelle] INSTEAD OF INSERT
begin
  UPDATE __new SET [ID Feld]=newid() WHERE [ID Feld] is null;
  INSERT INTO [meine Tabelle] SELECT * FROM __new;
end;
ansonsten auf die Tabelle im Dictionary (Architect Database repository) mit der rechten Maustaste --> Triggers.
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Trigger erstellen

Beitrag von Manfred »

so habe ich das gemacht.
jetzt kommt folgender Hinweis.
poQuery: Error 7200: AQE Error: State = HY000; NativeError = 5181; [SAP][Advantage SQL Engine][ASA] Error 5181: Trigger creation failed. An INSTEAD OF trigger of this type already exists.
Ich kann aber nichts finden, wo er abgelegt sein sollte. Was mache ich falsch?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Trigger erstellen

Beitrag von Marcus Herz »

Im ARC siehst du links im Contextmenü einer Tabelle den Eintrag Triggers, Dort kannst du einFenster öffnen, das alle anzeigt.
- wenn schon ein INSTEAD OF Trigger existiert, kann kein weiterer definiert werden => heisst auch, das script kann nicht 2x ausgeführt werden
- wenn du nur einen Default wert nach dem Insert setzen willst geht das auch einfacher:

Code: Alles auswählen

EXECUTE PROCEDURE sp_ModifyFieldProperty ( 'KUNDE', 
      'guid', 'Field_Default_Value', 
      'newidstring(''f'')', 'APPEND_FAIL', 'KUNDEfail' ); 
Du mausst halt den Tabellennamen KUNDE und das Feld 'guid' anpassen
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Trigger erstellen

Beitrag von Werner_Bayern »

Servus Manfred,

unter PG würde ich sagen, Du hast schon ein Feld vom Typ serial (AUTO_INCREMENT) erstellt?
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Trigger erstellen

Beitrag von nightcrawler »

Hallo Werner,
die Meldung ist das, was Marcus beschreibt.
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Trigger erstellen

Beitrag von nightcrawler »

Manfred hat geschrieben: Fr, 21. Mai 2021 9:32 Ich kann aber nichts finden, wo er abgelegt sein sollte. Was mache ich falsch?
Du könntest das Dictionary abfragen:

Code: Alles auswählen

SELECT * FROM system.triggers
evtl noch mit der Einschränkung

Code: Alles auswählen

SELECT * FROM system.triggers WHERE Trig_TableName LIKE 'meine Tabelle'
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Trigger erstellen

Beitrag von nightcrawler »

und dann weiter:

Code: Alles auswählen

TRY 
  DROP Trigger [meine Tabelle].[mein Trigger];
CATCH ALL 
END TRY;
CREATE TRIGGER ...
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Trigger erstellen

Beitrag von Manfred »

OK,
jetzt sind sie erstmal alle wieder weg.
Es ging aber nur über DROP Trigger (Joachim)
in der Tabelle, rechte Maustaste und dann Triggers, war alles leer. Oder meintet ihr was anderes?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Trigger erstellen

Beitrag von Marcus Herz »

evtl musst du erst ein Refresh des DD ausführen, wenn du mit SQL Trigger erstellst
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Trigger erstellen

Beitrag von Manfred »

#-o das kann natürlich sein. Daran habe ich nicht gedacht. Jetzt ist er auch zu sehen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Trigger erstellen

Beitrag von Werner_Bayern »

Servus Joachim,

könnte man über solche Trigger (insert, update, delete) auch 2 ADS untereinander abgleichen? Also ADS1 hat die 3 Trigger definiert, die dann ADS2 abgleichen, ADS2 hat dieselben 3 Trigger, die den ADS1 abgleichen.

Im jew. Trigger müsste man nur definieren, wenn z. B. der insert vom eigenen ADS kommt, dann nix machen, ansonsten feuern.

Geht sowas?
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Trigger erstellen

Beitrag von Marcus Herz »

Hallo Werner

Das ist eigentlich die Aufgabe von Replikation, Hab ich im Einsatz, funktioniert prima.
oder:
Versuch die 2 ADD zu linken. Im Trigger musst du abfragen, ob sich die relavanten felder geändert haben. Nur dann feuren,. So könntest du endlos Rekursion vermeiden
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Udo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 46
Registriert: Do, 18. Okt 2007 15:37

Re: Trigger erstellen

Beitrag von Udo »

Hallo Marcus,

Replikation setzt aber ADT Tabellen voraus - oder?
Gibt es auch eine Chance, wenn DBF/NTX mit dem ADS verwendet wird?

Gruß Udo
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Trigger erstellen

Beitrag von Marcus Herz »

Kann ADT und DBF
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Trigger erstellen

Beitrag von nightcrawler »

innerhalb der Trigger kannst Du nur auf demselben Server arbeiten - wenn DB2 auf einem anderen liegt, geht es nicht mehr .... außer Du erstellst den Trigger Code nicht in SQL sondern als Windows DLL, dann kannst Du jegliche non visual Schweinerei veranstalten;)
Replikation geht mit ADT und DBF. Voraussetzung ist die Verwendung eines Data Dictionaries sowie die Verwendung des ADS Servers (local Server geht nicht). Zudem müssen alle Updates über die Dictionary-Verbindung kommen (also nicht mehr im kompatiblen Modus).
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Udo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 46
Registriert: Do, 18. Okt 2007 15:37

Re: Trigger erstellen

Beitrag von Udo »

Hallo,
wenn ich das richtig verstehe, liste ich alle DBF Tabellen in einem DataDictionary auf und kann mit einer "Two-Way Replication" zwei ADS - Server (an zwei Unternehmensstandorten / VPN Tunnel) verbinden. An beiden Standorten kann mit dem selben Programm gearbeitet werden. Für auftretende Konflikte könnte ein Conflict-Trigger definiert werden.

Gibt es eine Möglichkeit DBF und NTX Tabellen per Script in das DataDictionry zu schreiben?

Glück Auf!
Udo
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Trigger erstellen

Beitrag von Marcus Herz »

Code: Alles auswählen

execute procedure sp_AddTableToDatabase('symbolname'     ,'dateiname.DBF '  , 1, 2, 'dateiindex1.ntx;dateiindex2.ntx', NULL );
die 1 steht für NTX, die 2 für OEM, Ich habe die Zeilen ohne Namen kopiert und dann die Dateiliste in eine TXT gepipt und dort rauskopiert und im Script eingefügt. Leerzeichen in den Namen stören nicht.
Symbolname und Dateiname möglichst gleich benennen, sonst blickt keiner mehr durch (es sei denn du möchst das :-)
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Trigger erstellen

Beitrag von nightcrawler »

wichtig: Du musst Deine Verbindung dann auch so umbiegen, dass Du die Connection immer über das Dictionary machst - nur dann kann der ADS auch erkennen, dass sich was geändert hat und den Datensatz in die Queue stecken.
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Antworten