Zum Inhalt springen

SQL Trigger Problem


Suraban

Empfohlene Beiträge

Hallo

Ich bin zur Zeit in einer Umschulung zum Fachinformatiker und z.Zt. in meinem Praktikum. Hier habe ich nun von meinem Chef eine Aufgabe bekommen einen SQL Trigger zu erstellen, ich habe nun schon ein paar Sachen darüber gelesen bin mir aber immer noch nicht ganz sicher wie das ganze aussehen soll.

Folgendes Problem :

Bei einem Shopsystem wo mehrere Artikel hinterlegt sind kann man zu gewissen Artikeln Zubehörartikel hinzufügen wenn man dies im Shop macht ändert sich zwar das Änderungsdatum in der Tabelle der Zubehörartikel aber es ändert sich nicht das Datum in der Artikeltabelle.

Hierzu soll nun ein Trigger geschrieben werden der :

Wenn in der Tabelle

dbo.ZUBEHOER

ein INSERT , UPDATE oder DELETE erfolgt

soll die Spalte GeaendertAm in der Tabelle

dbo.ART

auf die aktuelle Systemzeit mit Datum oder die Zeit der Änderung springen.

Wie genau muß dieser Trigger aussehen vielleicht gibt es ja jemand der mir helfen kann.

Vielen Dank

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also den Link habe ich schon gelesen aber wie du schon geschrieben hast habe ich generell verständigungsprobleme wie ich das was zu tun ist in die Syntax verpacke da ich das zum ersten mal mache. Wenn ich ein paar mal diese Trigger gemacht habe wird es sicher besser gehn . Den Trigger erstelle ich unter Microsoft SQL Server Managment Studio.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

die Syntax lautet so::

CREATE OR ALTER TRIGGER <routine-name> FOR <Tabellenname>

     [ ACTIVE | INACTIVE ]

     { BEFORE | AFTER }          /* bei MS-SQL heißt es INSTEAD OF */

     { INSERT | UPDATE | DELETE }

     [ POSITION <zahl> ]

AS 

BEGIN

     [ <variablenliste> ]

     <routine body>

END
Wenn wir das mit deinem Fall betrachten, müssen wir erstmal bestimmen, was wo einzusetzen ist. Die Optionen in [] sind optional,d.h. die kannst du auch weglassen, dann wird irgendeine Standardeinstellung benutzt.
CREATE OR ALTER TRIGGER test_trigger FOR dbo.ZUBEHOER...

Damit erstellst du einen Trigger namens test_trigger für die Tabelle dbo.ZUBEHOER.

Wann soll dieser was tun? Er soll etwas mit einer andere Tabelle NACH einem Insert tun. Also benutzen wir AFTER INSERT.

Wann soll dieser was tun? Er soll die Spalte GeaendertAm der Tabelle dbo.ART aktualisieren.

Jetzt müsste man wissen, wie deine Tabelle ART aussieht. Wenn da einfach nur irgendetwas eingefügt werden soll, dann reicht ja ein einfaches insert. Wenn sich diese Tabelle allerdings auf irgendeinen fremden Datensatz bezieht, müsste man erstmal ermitteln, welcher Datensatz genau geupdatet werden soll. Wichtig zu wissen wäre also, was für Spalten die Tabelle ART enthält.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Als ersten einmal vielen Dank für deine ausführliche Hilfe ....

in der Tabelle ART soll die Spalte GeaendertAm geändert werden und zwar auf das Datum und die Uhrzeit wo in der Tabelle Zubehoer ein INSERT DELETE oder UPDATE erfolgt hat

die Tabelle hat folgende Spalten

,[Artikelnummer]

,[EANNummer]

,[bezeichnung]

,[Zusatz]

,[Matchcode]

,[Artikelgruppe]

,[Erfolgskontengruppe]

,[Aufwandskontengruppe]

,[Mengenstaffel]

,[sSEinkauf]

,[KontoEinkauf]

,[sSVerkauf]

,[KontoVerkauf]

,[Mengeneinheit]

,[Preismengeneinheit]

,[Preismengenfaktor]

,[Preisverweis]

,[Preiseinheit]

,[Gewicht]

,[Lagerartikel]

,[LosgroesseVerkauf]

,[Mengenformel]

,[stueckliste]

,[stuecklistenExp]

,[serieCharge]

,[Variantenartikel]

,[MinusWarnung]

,[Provisionsfaehig]

,[Rabattfaehig]

,[skontofaehig]

,[Provisionsgruppe]

,[Hersteller]

,[HstArtikelnummer]

,[Lieferant]

,[Dispositionsart]

,[AutoBestellung]

,[Lagerstrategie]

,[Auslaufdatum]

,[bestandsauswahl]

,[inaktiv]

,[AngelegtAm]

,[AngelegtVon]

,[GeaendertAm]

,[GeaendertVon]

,[FreierText1]

,[FreierText2]

,[FreieZahl1]

,[FreieZahl2]

,[FreieZahl3]

,[FreieZahl4]

,[FreiesDatum1]

,[FreiesDatum2]

,[FreiesKennzeichen1]

,[FreiesKennzeichen2]

,[FreiesKennzeichen3]

,[FreiesKennzeichen4]

,[sSEG]

,[sSImport]

,[sSExport]

,[shopAktiv]

,[Region]

,[ursprungsland]

,[Geschaeftsart]

,[Warencode]

,[statVersand]

,[statEingang]

,[statWert]

,[statWertEuro]

,[Kostenstelle]

,[Kostentraeger]

,[DNExport]

,[Ausschussartikelnummer]

,[Produktionslager]

,[AusschussBewertung]

,[Verfallsfrist]

,[TS]

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich sollte vielleicht noch dazu sagen was sich in der Tabelle Zubehoer sich für Spalten befinden ...

,[ArtArtikelnummer]

,[Pos]

,[Artikelnummer]

,[Mengenformel]

,[Mengeneinheit]

,[Preisgruppe]

,[Mengenaktualisierung]

,[Einfuegemodus]

,[Verwendung]

,[AngelegtAm]

,[AngelegtVon]

,[bearbeitetAm]

,[bearbeitetVon]

,[TS]

und die Zeit und Datum in der Tabelle Art soll nach dem insert Delete oder update der Zeit entsprechen die in der Tabelle Zubehoer unter BearbeitetAm steht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

ich vermute mal dass Artikelnummer Primärschlüssel der einen Tabelle und Fremdschlüssel der anderen Tabelle ist? D.h. diese Nr. sollte ja dann sowohl in der Tabelle ART als auch ZUBEHÖR stehen, und stellt somit eine bestimmte Beziehung dar. Du musst nun herausfinden, wie die Tabelle ART und ZUBEHÖR zueinander stehen. Wenn jetzt irgendein Artikel in die Tabelle ZUBEHÖR eingestellt/gelöscht/geändert wird, muss in der Tabelle ART der Datensatz herausgesucht werden, und in diesem Datensatz das Attribut "GeaendertAm" entsprechend geupdatet werden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Richtig die Artikelnummer steht bei beiden drin

In der Tabelle Art stehen alle Artikel drin die es im System gibt hier kann man für jeden Artikel einen Zubehör Artikel wählen auch aus der Liste der Artikel wenn das getan wurde erscheint dieser Artikel in der Tabelle Zubehör . Also erst wenn ein Artikel als Zubehör gewählt wurde kommt er da rein.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

ich kenn die MSSQL Trigger nicht, aber in Oracle hast Du die Werte der neuen/geänderten Zeile über entsprechende variablen im Zugriff und kannst sie im Trigger auch durch eine einfache Zuweisung ändern.

D.H. du musst in der Doku nachsehen, ob es sowas auch für MSSQL gibt (geh ich mal davon aus) und dann dein Änderungsdatum über diese Variable in einem Bevor Update oder Bevor Insert trigger ändern.

Ein extra UPDATE aus dem Trigger heraus sollte nicht nötig sein (mal davon abgesehen, dass Du in deinem Update keine WHERE Bedingung drinnen hast und somit alle Datensätze ändern würdest).

Dim

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hmmm da komm ich nicht so ganz mit wenn ich mir das Firebird Beispiel anschaue mit dem Timestamp

CREATE OR ALTER TRIGGER Mitarbeiter_BU1 FOR Mitarbeiter

ACTIVE BEFORE INSERT OR UPDATE POSITION 1

AS

BEGIN

new.Last_User = CURRENT_USER;

new.Last_Change = CURRENT_TIMESTAMP;

END

und es mit meinem Trigger vergleiche :

CREATE TRIGGER test_trigger

ON ZUBEHOER

AFTER INSERT

AS

BEGIN

SET NOCOUNT ON

UPDATE ART

SET GeaendertAm=CURRENT_TIMESTAMP

FROM ZUBEHOER

END

weiß ich echt nicht wieso mein Trigger die komplette Datenbank platt macht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok ich hab Ihn nochmals durchgelesen und 2 Worte sind mir ins Auge gesprungen Variablen und Where Bedingung ...

Das mit den Variablen versteh ich auf keinem Auge und das mir noch eine Where Bedingung fehlt weiß ich .

Wie gesagt ich habe nicht das Problem das ich nicht das Verständnis für die Logik und die Funktionen habe sondern mein Problem ist diese Logik in die richtige Syntax zu bringen !

Link zu diesem Kommentar
Auf anderen Seiten teilen

CREATE TRIGGER test_trigger

ON [dbo].[ZUBEHOER]

AFTER INSERT

AS

BEGIN

SET NOCOUNT ON;

DECLARE

@BearbeitetAm datetime,

@ArtArtikelnummer varchar(50)

SET @BearbeitetAm = (SELECT BearbeitetAm FROM inserted);

SET @ArtArtikelnummer = (SELECT ArtArtikelnummer FROM inserted);

UPDATE [dbo].[ART]

SET GeaendertAm = @BearbeitetAm

WHERE @ArtArtikelnummer = Artikelnummer

END

So nun habe ich das mal versucht nur leider mit dem selben ergebnis . Weiß einer was von euch an was es liegen könnte ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...