fresh-toddo Geschrieben 18. Februar 2010 Teilen Geschrieben 18. Februar 2010 Hallo zusammen, bin neu hier und hab gleich mal ne Frage oder besser gesagt ein Problem! Wäre super wenn mir jemand helfen könnte... Ich habe einen Datenbanktrigger für eine Tabelle auf einem MS SQL Server geschrieben. Dieser Trigger soll bei einem Insert Befehl auf eine bestimmt Tabelle ein Feld in einer anderen Tabelle mit einem Wert aktualisieren. Hier mal mein Code: CREATE TRIGGER trigg_kontID_anlegen ON <Datenbank> FOR INSERT AS DECLARE @highestId int DECLARE @accIdInserted VARCHAR(255) DECLARE @idNew int SELECT @highestId = (SELECT MAX(New_contactid) FROM ContactExtensionBase) PRINT @highestId SELECT @accIdInserted = (SELECT ContactId FROM Inserted) PRINT @accIdInserted SELECT @accIdInserted = '{'+@accIdInserted +'}' PRINT @accIdInserted SELECT @idNew = @highestId +1 PRINT @idNew Update ContactExtensionBase SET New_contactid = @idNew WHERE ContactId = (@accIdInserted) Habe über den QueryAnalyzer die Werte geprüft...das lesen des höchsten Wertes klappt, das ermitteln der AccountId und schreiben in die entsprechende Variable klappt etc....aber er schreibt den Wert nicht in die Tabelle! Ersetze ich aber in der WHERE Klausel die Variable durch einen fixen Wert in der Form wie er auch in der DB vorkommt dann klappt es...hat jemand ne Idee woran das liegen könnte? Wäre super weiß langsam net mehr weiter... Hoffe ist einigermaßen verständlich geschildert das Problem schon mal danke im Voraus fresh-toddo Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Corto -sX- Geschrieben 18. Februar 2010 Teilen Geschrieben 18. Februar 2010 wirft er nen SQL-Fehler wenn du das update mit der Variablen versuchst? Eigentlich sollte er ja einen werfen, oder schreiben... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
fresh-toddo Geschrieben 18. Februar 2010 Autor Teilen Geschrieben 18. Februar 2010 sollte er eigentlich ich weiß aber nicht genau wo ich da nachsehen kann...die Dateneingabe erfolgt über eine Maske aus dem MS CRM! gibt es im SQL Server irgendwo ein Fehlerlog oder ähnliches? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Corto -sX- Geschrieben 18. Februar 2010 Teilen Geschrieben 18. Februar 2010 ich bin nur Oracle - Mensch aber versuchs mal über SQLPLUS, das sollte ja was zurückgeben... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
fresh-toddo Geschrieben 19. Februar 2010 Autor Teilen Geschrieben 19. Februar 2010 ist sqlplus nicht für oracle? ich habe jetzt in dem trigger mal mit @@error die Fehler ausgeben lassen...Ergebnis= 0 zur Info vielleicht noch...die Werte in der WHERE Klausel haben folgende Form: {CAA20779-C764-DB11-807E-005056C00026} Wäre super wenn noch jemand den ein oder anderen Tipp für mich hat... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
RipperFox Geschrieben 23. Februar 2010 Teilen Geschrieben 23. Februar 2010 Nach grobem überfliegen: Der Trigger sollte eigentlich funktionieren. Sicher das der nix tut? Wenn du eh mit GUIDs hantierst: Da gibts auch den Datentyp "uniqueidentifier".. Grüße Ripper Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
fresh-toddo Geschrieben 24. Februar 2010 Autor Teilen Geschrieben 24. Februar 2010 hallo, erstmal danke für deine antwort! dachte eigentlich auch es müsste funktionieren...also der trigger tut nichts oder zumindest nicht das was er soll! also der wurm hängt in dem WHERE statement...nur warum oder woran genau da bin ich noch nicht dahinter gestiegen...könnte es ein problem mit dem datentyp sein?? die ID die ich in die variable @accIdInserted auslese und in der Where Abfrage verwende hat in der DB den Datentyp Uniqueidentifier...der Datentyp der Variablen ist aber NVARCHAR könnte das es problem sein? in der Tabelle auf die ich den Update Befehl inkl. Where Abfrage ausführe hat diese Id auch den Datentyp NVARCHAR...von welchem Datentyp sollte jetzt meine Variable sein?? haste ne idee oder ein tipp für mich? gruß fresh-toddo Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
RipperFox Geschrieben 24. Februar 2010 Teilen Geschrieben 24. Februar 2010 Probieren.. vll. ist SELECT @accIdInserted = '{'+@accIdInserted +'}' ungünstig? Normalerweise kannst du Uniqueidentifiers ohne Stringfummelei in Varchar casten und umgekehrt. Vileicht sind auch deine GUIDs Schrott - Prozedur zum testen usw. gibts hier: Jess Chadwick: Coder: Safe Handling of Uniqueidentifier Using T-SQL Grüße Ripper Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
fresh-toddo Geschrieben 24. Februar 2010 Autor Teilen Geschrieben 24. Februar 2010 SELECT @accIdInserted = '{'+@accIdInserted +'}' ungünstig? das war nur ein versuch...das habe ich bereits rückgängig gemacht hab jetzt versucht die id auszulesen und direkt in nvarchar umzuwandeln die syntax müsste denk ich soweit richtig sein... SELECT @conIdInserted = (SELECT CAST (ContactId AS NVARCHAR) FROM Inserted) wenn ich das ganze aber mit dem sql analyzer prüfe bekomme ich einen feher: Arythmetischer Überlauffehler beim Konvetieren von Expression in den Datentyp nvarchar. Haste ne ahnung woran das liegt? oder kann ich das konvertieren auf diesem weg nicht durchführen? die variable @conIdInserted habe ich zuvor als NVARCHAR(40) deklariert... gruß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
fresh-toddo Geschrieben 24. Februar 2010 Autor Teilen Geschrieben 24. Februar 2010 SELECT @conIdInserted = (SELECT CAST (ContactId AS NVARCHAR(40)) FROM Inserted) ok...so nimmt er den befehl...aber leider immer noch nicht mit dem gewünschten erfolg...bekomme immer noch keine werte in die db Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
fresh-toddo Geschrieben 24. Februar 2010 Autor Teilen Geschrieben 24. Februar 2010 so habe den trigger zu testzwecken nochmal leicht geändert ich hole mir die id die ich für die Where-Abfrage in meinem Update Statement verwende nicht mehr aus dem Insert-Datensatz sondern lese mir via SELECT einen beliebigen Datensatz aus und schreibe die ID in die Variable! zu meinem verwundern funktioniert dann alles so wie es soll...das heißt die mit 1 addierte zahl wird in das gewünschte feld in der DB geschrieben! jetzt verstehe ich umsoweniger warum mein trigger nicht so funzt wie er soll?? der wert in der variable ist doch derselbe ob ich ihn jetzt aus dem Insert-datensatz oder aus einem select befehl auslese ist doch egal?? oder hab ich irgendwo ein denkfehler? Hier mein angepasster trigger: CREATE TRIGGER trigg_kontID_anlegen ON ContactBase FOR INSERT AS DECLARE @highestId int DECLARE @id uniqueidentifier DECLARE @conIdInserted NVARCHAR(40) DECLARE @idNew int -- höchste ID auslesen SELECT @highestId = (SELECT MAX(New_contactid) FROM ContactExtensionBase) PRINT 'Hoechste Zahl:' PRINT @highestId -- 1 addieren SELECT @idNew = @highestId +1 PRINT @idNew SELECT @id = (SELECT ContactId FROM ContactBase WHERE LastName = 'Test_mi_0224_02') PRINT @id SET @conIdInserted = (SELECT CAST (@id AS NVARCHAR(40))) PRINT @conIdInserted Update ContactExtensionBase SET New_contactid = @idNew WHERE ContactId = @id bin für tipps und anregungen dankbar gruß fresh-toddo Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
RipperFox Geschrieben 24. Februar 2010 Teilen Geschrieben 24. Februar 2010 Ich krieg das mit deinen Datentypen von dir grade nicht in den Kopf - wie sehen deine Tabellen aus? Wird ContactId ggf. von nem anderen Trigger erst erzeugt? *g* Grüße Ripper Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
fresh-toddo Geschrieben 25. Februar 2010 Autor Teilen Geschrieben 25. Februar 2010 sorry wenn es etwas verwirrend ist...versuche mal klarheit zu verschaffen ich habe 2 tabellen: contact und contactExtension contact: - ContactId (Uniqueidentifier) - ...rest aus der Tabelle ist unwichtig... contactExtention: - ContactId (NVARCHAR) wird automatisch angelgt bei neuem Eintrag in die contact tabelle - New_contactid (int) von mir angelegtes Attribut in das ich bei jedem insert auf die tabelle contact einen Wert reinschreiben will --> mit dem trigger der nicht funktioniert habe das jetzt versucht so zu lösen das ich bei einem insert befehl auf die contact tabelle mir die ContactId aus dem "Inserted" raus hole die in eine variable schreibe (typ: uniqueidentifier) und diese dann in eine neue vom typ NVARCHAR caste (kann ich den wert auch direkt in die NVARCHAR variable schreiben?) und mit hilfe dieser variablen den datensatz in der tabelle contactExtension auswähle (WHERE) in dem der wer New_contactid aktualisiert werden soll...klingt vielleicht verwierend aber is die einzige möglichkeit gruß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
fresh-toddo Geschrieben 2. März 2010 Autor Teilen Geschrieben 2. März 2010 hat keiner ne idee woran es liegen könnte?:confused: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
RipperFox Geschrieben 2. März 2010 Teilen Geschrieben 2. März 2010 Postest Du vllt. mal die CREATE TABLE und CREATE TRIGGER Anweisungen? Bin zu faul, das einzuhacken Grüße Ripper Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 2. März 2010 Teilen Geschrieben 2. März 2010 Unabhängig vom Funktieren oder Nichtfunktionieren, wirst Du in einer Multiuserumgebung irgendwelche MAX Werte ermitteln, die nicht zwangsläufig das darstellen, was Du dir vielleicht vorstellst. Ich kenne den genauen Grund für dieses Update nicht (den man sowieso nicht in einem Trigger verstecken, sondern in der Zugriffsschicht suaber implemtieren sollte) aber wenn Du damit Tabellenverknüpfungen aufbauen möchtest, hast Du einen gewaltigen Bug im Programm der umso mehr zum tragen kommt je mehr User hier gleichzeitig Änderungen vornehmen. Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
fresh-toddo Geschrieben 3. März 2010 Autor Teilen Geschrieben 3. März 2010 den trigger hab ich ja bereits gepostet oder was meinst du genau? Create Table liefer ich noch nach... @dr.dimitri: das das nicht die ideallösung ist da bin ich auch schon drauf hingewiesen worden aber bin nicht so der programmierer weiß net wie ich es sonst machen soll...haste ne eine andere idee? ich nutze das nicht um verknüpfungen herzustellen...die verknüpfung ist bereits vorhanden ich möchte nur für den Datensatz eine weitere eindeutige Zahl generieren...bräuchte die where klausel aber auch in einem anderen trigger in dem ich lediglich den primärschlüssel in ein neues feld kopieren möchte Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
fresh-toddo Geschrieben 19. März 2010 Autor Teilen Geschrieben 19. März 2010 hallo, hier mal mein abgeänderter trigger...funktioniert leider immer noch nicht! bitte um vorschläge wo es haken könnte... -- neuen Trigger anlegen CREATE TRIGGER trigg_kontID_anlegen -- Trigger ist verbunden mit folgender Tabelle ON ContactBase -- Trigger wird fuer jeden Insert Befehl auf der Tabelle ausgeführt FOR INSERT -- jede Codezeile die nach dem AS Befehl steht wird beim starten des Triggers ausgeführt AS -- Variablen Deklaration DECLARE @highestId int --DECLARE @accIdInserted NVARCHAR(255) DECLARE @idNew int -- ######################################################################################## -- höchste ID auslesen SELECT @highestId = (SELECT MAX(New_contactid) FROM ContactExtensionBase) PRINT 'Hoechste Zahl:' PRINT @highestId -- 1 addieren SELECT @idNew = @highestId +1 PRINT @idNew -- ######################################################################################## Update ContactExtensionBase SET New_contactid = @idNew WHERE ContactId = (SELECT ContactId FROM Inserted) --Update ContactExtensionBase SET New_contactid = @idNew WHERE ContactId = ('DC4FE843-A41F-DF11-92A7-005056C00008') ---> FUNKTIONIERT --Update ContactExtensionBase SET New_contactid = @idNew WHERE ContactId = ('{24765A21-831C-DF11-81CD-005056C00008}') ---> FUNKTIONIERT bin für jeden tipp dankbar! gibt es vielleicht ne möglichkeit das ganze anders zu lösen? ohne trigger? gruß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Goos Geschrieben 23. März 2010 Teilen Geschrieben 23. März 2010 contactExtention: - ContactId (NVARCHAR) wird automatisch angelgt bei neuem Eintrag in die contact tabelle Es gibt zur Laufzeit deines Triggers noch keinen entsprechenden ContactId Eintrag in der contactExtention Tabelle. Vielleicht erklärst mal, wie bzw. wann der angelegt werden sollte und was du dabei unter automatisch verstehst. Goos Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
fresh-toddo Geschrieben 26. März 2010 Autor Teilen Geschrieben 26. März 2010 Hallo zusammen, das Problem ist gelöst! Habe den Trigger auf der falschen Tabelle ausgeführt. Der Datensatz hat noch nicht existiert. Habe ihn jetzt für die Tabelle ContactExtensionBase angelegt und schon funktioniert alles. Danke euch allen für eure Hilfe! Schönes Wochenende Gruß fresh-toddo 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.