Zum Inhalt springen

SQL Server Trigger - Problem WHERE Klausel


fresh-toddo

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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ß

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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ß

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 3 Wochen später...

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ß

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

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...