Suraban Geschrieben 19. Mai 2011 Teilen Geschrieben 19. Mai 2011 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 19. Mai 2011 Teilen Geschrieben 19. Mai 2011 Hi, naja, was zu tun ist steht ja da. Im Grunde fehlt dir nur die Syntax, oder hast du generell Verständnisprobleme bezüglich Trigger? Ansonsten wäre das Datenbanksystem noch interessant, weil die Syntax teilweise unterschiedlich sein kann. http://de.wikibooks.org/wiki/Einf%C3%BChrung_in_SQL:_Trigger Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Suraban Geschrieben 19. Mai 2011 Autor Teilen Geschrieben 19. Mai 2011 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 19. Mai 2011 Teilen Geschrieben 19. Mai 2011 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Suraban Geschrieben 19. Mai 2011 Autor Teilen Geschrieben 19. Mai 2011 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] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 19. Mai 2011 Teilen Geschrieben 19. Mai 2011 Hi, erstmal vielleicht eine Frage: Handelt es sich dabei um eine Testdatenbank? Nicht dass du da irgendwelche Daten durcheinanderbringst oder löscht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Suraban Geschrieben 19. Mai 2011 Autor Teilen Geschrieben 19. Mai 2011 Ja es handelt sich um eine lokale Datenbank die zu testzwecken genuzt wird erst bei Erfolg wird es auf die Orginaldatenbank aufgespielt ! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Suraban Geschrieben 19. Mai 2011 Autor Teilen Geschrieben 19. Mai 2011 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 19. Mai 2011 Teilen Geschrieben 19. Mai 2011 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Suraban Geschrieben 19. Mai 2011 Autor Teilen Geschrieben 19. Mai 2011 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Suraban Geschrieben 19. Mai 2011 Autor Teilen Geschrieben 19. Mai 2011 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Suraban Geschrieben 20. Mai 2011 Autor Teilen Geschrieben 20. Mai 2011 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 . Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 20. Mai 2011 Teilen Geschrieben 20. Mai 2011 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Suraban Geschrieben 20. Mai 2011 Autor Teilen Geschrieben 20. Mai 2011 Ja das mit den Variablen gibt es nur weiß ich absolut nicht welche Werte ich als Variablen declarieren soll bei meinem Problem Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Suraban Geschrieben 24. Mai 2011 Autor Teilen Geschrieben 24. Mai 2011 Hat keiner noch einen Lösungsvorschlag für mich oder kann mir helfen das ich das verstehe ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 24. Mai 2011 Teilen Geschrieben 24. Mai 2011 Hi, soweit ich das verstanden haben, ist doch quasi dieses "Firebird" Beispiel fast die Lösung deines Problems: Einführung in SQL: Trigger Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Suraban Geschrieben 24. Mai 2011 Autor Teilen Geschrieben 24. Mai 2011 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 24. Mai 2011 Teilen Geschrieben 24. Mai 2011 Vielleicht ließt Du dir nochmal meinen Beitrag #13 genau durch, dann bekommst Du schon mal einen Hinweis darauf. Unabhängig davon ist die Update Version schon vom Ansatz her falsch. Vergiss ihn einfach. Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Suraban Geschrieben 24. Mai 2011 Autor Teilen Geschrieben 24. Mai 2011 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 ! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Suraban Geschrieben 25. Mai 2011 Autor Teilen Geschrieben 25. Mai 2011 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 ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.