Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

MS SQL Datenbanktrigger - Problem

Frage Entwicklung Datenbanken

Mitglied: freshToto

freshToto (Level 1) - Jetzt verbinden

03.03.2010 um 14:36 Uhr, 8937 Aufrufe, 16 Kommentare

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. Was ebenfalls funktioniert ist, wenn ich der in der Where Klausel verwendeten Variable vorher einen festen Wert zuweise.
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

freshToto
Mitglied: thaenhusen
03.03.2010 um 15:24 Uhr
Moin.

SELECT @accIdInserted = '{'+@accIdInserted +'}'

accidInserted ist doch sicher ein int??? Das müsste schon knallen. Oder benutzt Du Text-IDs?

Versuch doch mal:

Update ContactExtensionBase SET New_contactid = @idNew WHERE ContactId = (SELECT ContactId FROM Inserted)

bzw.

Update ContactExtensionBase SET New_contactid = @idNew WHERE ContactId = '{' + cast((SELECT ContactId FROM Inserted) as varchar) + '}'

bzw.

Update ContactExtensionBase SET New_contactid = @idNew WHERE ContactId = '{' + (SELECT ContactId FROM Inserted) + '}'

HTH
MK
Bitte warten ..
Mitglied: freshToto
04.03.2010 um 08:15 Uhr
servus,
erstmal danke für deine schnelle antwort und die vorschläge!
werde das gleich mal ausprobieren...

die @accIdInserted ist kein Int...die Variable habe ich als Varchar und die werte aus der Tabelle die da rein sollen haben diese Form: {'DC4FE843-A41F-DF11-92A7-005056C00008'} ist der primärschlüssel der tabelle
und hat den typ uniqueidentifier...habe auch schon probiert die variable wo dieser wert rein soll als uniqueidentifier zu deklarieren aber auch ohne erfolg...
Bitte warten ..
Mitglied: MadMax
04.03.2010 um 09:05 Uhr
Moin freshToto,

was mir spontan auffällt:
hat die ContactId in der Tabelle geschweifte Klammern oder nicht?

01.
SELECT @accIdInserted = (SELECT ContactId FROM Inserted) 
02.
PRINT @accIdInserted 
03.
SELECT @accIdInserted = '{'+@accIdInserted +'}'
...
01.
... WHERE ContactId = (@accIdInserted)
Im ersten Teil ist die ContactId anscheinend ohne geschweifte Klammern drumrum, deshalb setzt Du sie. Im zweiten Teil fragst Du aber die ContactId ab mit dem Wert, dem Du vorher die Klammern verpaßt hast. Wenn beide Anweisungen sich auf die selbe Tabelle beziehen, dann kann das kaum klappen. Wenn sie sich auf verschiedene Tabellen beziehen, dann müßte diese ContactId einmal mit und einmal ohne die Klammern gespeichert sein.

Sollte das Dein Problem nicht lösen, wäre Deine Tabellendefinition und auch ein, zwei Beispieldatensätze hilfreich, um Dir weiterzuhelfen.

Achja, noch ein kleiner Nachtrag: Dein Trigger wird auch nur richtig funktionieren, wenn Du nur einen DS aktualisierst. Bei mehreren bräuchtest Du einen Cursor über inserted oder schreibst die Befehle so um, daß in einem Rutsch alle DS aktualisiert werden.

Gruß, Mad Max
Bitte warten ..
Mitglied: freshToto
04.03.2010 um 09:23 Uhr
hallo Mad Max,
erstmal danke!
wenn ich mir den Tabelleninhalt im SQL Manager anzeigen lasse sind die { }-Klammern zu sehen...wenn ich den inhalt mit dem query analyzer auslese sind sie aber nicht dabei...habe deshalb schon probiert die klammern der variablen mit zu geben wie in dem beispiel das ich gepostet hab...hab es aber auch schon ohne versucht!
werde gleich noch genauere Infos zu den Tabellen inkl. Datensätze posten.
das es keine ideallösung ist mit dem trigger weiß ich...aber wird eher unwahrscheinlich sein das mehrere DS zeitgleich aktualisiert werden und brauche diese where funktion auch in einem anderen zusammenhang
wie meinst du das mit dem cursor? muss da ein cursor auf den angelegten DS gelesetzt werden oder wie funktioniert das?

gruß
freshToto
Bitte warten ..
Mitglied: MadMax
04.03.2010 um 13:06 Uhr
Moin freshToto,

geh mal davon aus, daß da keine geschweiften Klammern drumrum sind.

Mit dem Cursor meine ich, daß Du alle DS in inserted einzeln abläufst und verarbeitest.

Gruß, Mad Max
Bitte warten ..
Mitglied: freshToto
04.03.2010 um 13:16 Uhr
servus,
ok werde mir das bei gelegenheit mal anschauen!
kann derzeit leider nicht an die umgebung dran...handelt sich um ne virtuelle testumgebung die gerade umgezogen wird (chaotische geschichte)

werde eure vorschläge ausprobieren bzw. umsetzen sobald ich wieder meine VM zur Verfügung habe...werde mich dann wieder an auch richten!
auf jeden fall schon mal danke für die tipps!

gruß
freshToto
Bitte warten ..
Mitglied: freshToto
19.03.2010 um 12:08 Uhr
hallo,
konnte leider länger nicht an dem problem arbeiten habe erst heute wieder damit angefangen!

@thaenhusen:
habe deine code vorschläge ausprobiert jedoch ohne erfolg!
bei dem letzten beispiel bekomme ich zudem einen syntaxfehler (ungültiger Operator für Datentyp. Operator ist add, Typ ist uniqueidentifier.)

hier nocheinmal ein paar infos zu meinen tabellen:

tabelle 1: contactbase

ContactId uniqueidentifier (vom System vorgegeben)
Name
....

tabelle 2: contactextensionbase

ContactId uniqueidentifier (vom System vorgegeben)
New_contactid int (hier soll die hochgezählte ID reingeschrieben werden)

habt ihr noch ne idee wo mein problem liegen könnte? bekomme langsam etwas druck und hab keine idee mehr...
gibt es vielleicht ne möglichkeit ohne trigger einen wert bei einem insert befehl in eine andere tabelle zu schreiben??

bin für jeden tip dankbar!

gruß
freshToto
Bitte warten ..
Mitglied: thaenhusen
19.03.2010 um 13:19 Uhr
Moin.

Hatte ich nicht darauf geachtet:

Hast Du denn in der ContactExtensionBase schon einen Eintrag der Update-bar ist?
Ansonsten musst Du das als Insert formulieren.

HTH
MK
Bitte warten ..
Mitglied: freshToto
19.03.2010 um 13:58 Uhr
ja der eintrag den ich updaten will existiert bereits!
das ganze läuft so ab:
ich füge über die oberfläche des programms einen datensatz hinzu
der datensatz wird in der contactbase angelegt und ebenfalls ein verknüpfter Datensatz in der extensionbase
hier sind aber bis auf die ContactId alle felder <NULL> und eins dieser felder möchte ich mit dem Update befehl befüllen...
Bitte warten ..
Mitglied: thaenhusen
19.03.2010 um 16:04 Uhr
Moin.

ja der eintrag den ich updaten will existiert bereits!
das ganze läuft so ab:
ich füge über die oberfläche des programms einen datensatz hinzu
der datensatz wird in der contactbase angelegt und ebenfalls ein verknüpfter Datensatz in der extensionbase
hier sind aber bis auf die ContactId alle felder <NULL> und eins dieser felder möchte ich mit dem Update befehl befüllen...

Kann es sein, dass der Trigger versucht zu updaten (extensionbase), während Du noch einfügst?

Poste mal die Tabellen struktur und den Insert in die beiden Tabellen. Irgendetwas stimmt da nicht.
Ich arbeite hier mit zig Update und Insert Triggern. Und eigentlich ist das überhaupt kein Problem.

HTH
MK
Bitte warten ..
Mitglied: freshToto
19.03.2010 um 16:28 Uhr
Nein ich denke nicht. Ich habe den Trigger nämlich schon mit fixen Werten getestet. Das heißt ich habe in das Update Statement statt der Variable im WHERE Teil einen fixen Wert eingetragen (z.B. WHERE ContactId = {32E5C0B2-1F68-DB11-807E-005056C00001}) und das hat dann funktioniert!
also gehe ich mal von aus das er fertig ist!?

was möchtest du bei der db struktur genau haben? ist kein selbstentwickeltes produkt! es geht hier um microsofts crm ich habe hier nur über das crm die db angepasst und möchte dieses feld jetzt mit einem trigger befüllen!

zum testen des triggers im sql query analyzer nutze ich folgenden insert
USE *_MSCRM

GO

SET NOCOUNT ON

INSERT INTO ContactBase (ContactId, StateCode, DeletionStateCode, FirstName, LastName)
VALUES('{32E5C0B2-1F68-DB11-807E-005056C00001}', 0, 0, 'Name', 'Lname')

ich teste damit nur die Inhalte der Variablen! In die Extension Base wird hier nicht geschrieben!
Wie der richtige Insert aussieht weiß ich nicht! Ist wie gesagt kein eigengestriktes Produkt? Kann ich das irgendwo herausfinden?

hoffe die Infos helfen etwas weiter...

gruß
Bitte warten ..
Mitglied: MadMax
20.03.2010 um 14:45 Uhr
Hallo freshToto,

nach Deinen Infos habe ich jetzt mal Deine Sachen nachgebildet:
01.
create table ContactBase (ContactId uniqueidentifier, StateCode int, DeletionStateCode int, FirstName varchar (50), LastName varchar (50)) 
02.
go 
03.
create table ContactExtensionBase (ContactId uniqueidentifier, New_contactid int) 
04.
go 
05.
 
06.
CREATE TRIGGER trigg_kontID_anlegen 
07.
ON ContactBase 
08.
FOR INSERT 
09.
AS 
10.
 
11.
DECLARE @highestId int 
12.
DECLARE @accIdInserted VARCHAR(255) 
13.
DECLARE @idNew int 
14.
 
15.
SELECT @highestId = (SELECT IsNull (MAX(New_contactid), 0) FROM ContactExtensionBase) 
16.
PRINT @highestId 
17.
 
18.
SELECT @accIdInserted = (SELECT ContactId FROM Inserted) 
19.
PRINT @accIdInserted 
20.
SELECT @accIdInserted = '{'+@accIdInserted +'}' 
21.
PRINT @accIdInserted 
22.
SELECT @idNew = @highestId +1 
23.
PRINT @idNew 
24.
 
25.
Update ContactExtensionBase SET New_contactid = @idNew WHERE ContactId = (@accIdInserted) 
26.
go 
27.
 
28.
INSERT INTO ContactExtensionBase (ContactId) 
29.
VALUES('{32E5C0B2-1F68-DB11-807E-005056C00001}') 
30.
INSERT INTO ContactBase (ContactId, StateCode, DeletionStateCode, FirstName, LastName) 
31.
VALUES('{32E5C0B2-1F68-DB11-807E-005056C00001}', 0, 0, 'Name', 'Lname') 
32.
 
33.
INSERT INTO ContactExtensionBase (ContactId) 
34.
VALUES('{32E5C0B2-1F68-DB11-807E-005056C00002}') 
35.
INSERT INTO ContactBase (ContactId, StateCode, DeletionStateCode, FirstName, LastName) 
36.
VALUES('{32E5C0B2-1F68-DB11-807E-005056C00002}', 0, 0, 'Name', 'Lname') 
37.
 
38.
select * from ContactBase 
39.
select * from ContactExtensionBase 
40.
go
Einzige Änderung, die ich gemacht habe, ist, daß ich ein IsNull beim Lesen der New_contactid dazugefügt habe, damit auch beim ersten Eintrag was ordentliches zurückkommt.

Also bei mir läuft das.

Also gibt es folgende Möglichkeiten:
1. Wie es thaenhusen schon angesprochen hat, ContactExtensionBase wird erst nach ContactBase geschrieben, der DS existiert also zur Laufzeit des Triggers noch nicht.
2. Ich hab das auf einer DB mit ohne SP ausprobiert, vielleicht macht irgendein SP etwas, was Probleme bereitet.

Aber ich tendiere eher zu Möglichkeit 1.

Gruß, Mad Max
Bitte warten ..
Mitglied: freshToto
22.03.2010 um 22:39 Uhr
Hallo Mad Max,
erstmal tausend dank für die Mühe die du dir gemacht hast!!!
Gibt es ne Möglichkeit das irgendwie zu prüfen ob der eintrag schon existiert wenn der trigger läuft!? oder kann man den trigger Zeitverzögert starten lassen oder sowas in der art?

Gruß
freshToto
Bitte warten ..
Mitglied: MadMax
22.03.2010 um 22:58 Uhr
Nabend freshToto,

zeitverzögert bringt ja nix, die Datensätze werden ja nicht parallel angelegt. Mit einer Warteschleife im Trigger würdest Du bis zum Sankt-Nimmerleinstag warten.

Wie prüft man das? Das Update ohne Ergebnis ist ja gewissermaßen die Prüfung. Du könntest am Anfang vom Trigger ein select machen, aber der Vergleich wäre ja derselbe wie imUpdate auch. Ich würde wohl im Profiler die Reihenfolge prüfen. Wenn Du den hast

Aber schreib Deinen Trigger doch einfach nicht für ContactBase, sondern für ContactExtensionBase. Ist ja sowieso sinnvoller, denn eigentlich willst Du ja nur dem neuen Datensatz eine Nummer verpassen, der Bezug zu ContactBase interessiert in dem Moment doch gar nicht.

Gruß, Mad Max
Bitte warten ..
Mitglied: freshToto
26.03.2010 um 15:47 Uhr
Hallo Mad Max,
sorry konnte es erst heute testen! Es funktioniert!!! Hatte die Hoffnung schon aufgegeben und dann war es doch so ein simpler Fehler!
Habe den Trigger jetzt für die Extension angelegt.

Tausend dank für deine Gedult und Mühe!!!

schönes Wochenende
Gruß
freshToto
Bitte warten ..
Mitglied: MadMax
26.03.2010 um 19:52 Uhr
Tja, mit Ruhm bekleckert hab ich mich auch nicht, das hätte ich auch eher merken können

Aber wenn es letztlich funktioniert, ist ja alles in Ordnung. Machst Du dann bitte noch ein Häkchen an dieses Thema

Dir auch ein schönes Wochenende.

Gruß, Mad Max
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(2)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Datenbanken
MS-SQL-Server + T-SQL+Batch (4)

Frage von kallewirsch zum Thema Datenbanken ...

Datenbanken
gelöst Täglicher Export einer View aus MS SQL 2008 in Excel oder CSV (9)

Frage von Arafat zum Thema Datenbanken ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (15)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...