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.

Empfohlene Antworten

Veröffentlicht

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

wirft er nen SQL-Fehler wenn du das update mit der Variablen versuchst?

Eigentlich sollte er ja einen werfen, oder schreiben...

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?

ich bin nur Oracle - Mensch :D

aber versuchs mal über SQLPLUS, das sollte ja was zurückgeben...

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

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

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ß

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

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

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ß

hat keiner ne idee woran es liegen könnte?:confused:

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

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

  • 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ß

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

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

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.