Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

SQL Trigger Problem

Empfohlene Antworten

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

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.

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.

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]

Ja es handelt sich um eine lokale Datenbank die zu testzwecken genuzt wird erst bei Erfolg wird es auf die Orginaldatenbank aufgespielt !

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.

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.

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.

Wieso kann ich das ganze nicht so schreiben ?

CREATE TRIGGER test_trigger

ON ZUBEHOER

AFTER INSERT, UPDATE, DELETE

AS

BEGIN

SET NOCOUNT ON

UPDATE ART SET GeaendertAm=BearbeitetAm

FROM ZUBEHOER

END

Au man ich habe seit gestern nichts anderes getan als mich über das Thema zu belesen aber das einzige was ich mit meinen Triggern hinbekomme ist das ich die Datenbank lahm lege und nichts mehr geht .

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

Ja das mit den Variablen gibt es nur weiß ich absolut nicht welche Werte ich als Variablen declarieren soll bei meinem Problem

Hat keiner noch einen Lösungsvorschlag für mich oder kann mir helfen das ich das verstehe ?

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.

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 !

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 ?

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.