Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: freshToto

freshToto (Level 1) - Jetzt verbinden

03.03.2010 um 14:36 Uhr, 9548 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 ..
Ähnliche Inhalte
Windows Tools
MS SQL Instanz
Frage von sebastian2608Windows Tools6 Kommentare

N´ Abend Leute, heute habe ich einen besonders seltsamen Fall für euch ;) Folgende Grundsituation: Ein Bekannter hatte bis ...

Datenbanken
MS-SQL-Server + T-SQL+Batch
Frage von kallewirschDatenbanken4 Kommentare

Hallo Gemeinde, mal wieder ein Problem aus dem Bereich des MS-SQL-Servers. Folgendes Thema: Nachts sollen automatisch Backups der DBen ...

Windows Server
Neuer MS-SQL-Server
gelöst Frage von tingelWindows Server1 Kommentar

Hallo, Ich bin gerade dabei, mir Gedanken zu machen, wie ich am besten unseren SQL-Server 2008 SP3 auf eine ...

Windows Server
MS SQL Login Problem
gelöst Frage von theoberlinWindows Server26 Kommentare

Hallo zusammen, Umgebung ist 2012r2 Domäne und MS SQL Express 2014 auf VM. ich habe folgende 2 Probleme: 1. ...

Neue Wissensbeiträge
Internet
EU-Urheberrechtsreform: Zusammenfassung
Information von Frank vor 1 TagInternet1 Kommentar

Auf golem.de gibt es eine Analyse von Friedhelm Greis, der das Thema EU-Urheberrechtsreform gut und strukturiert zusammenfasst. Zwar haben ...

Microsoft Office

Office365 Schwachstellen bei Sicherheit und Datenschutz

Information von Penny.Cilin vor 2 TagenMicrosoft Office7 Kommentare

Auf Heise+ gibt es einen Artikel bzgl. Office365 Schwachstellen. Das ist noch ein Grund mehr seine Daten nicht in ...

Sicherheit
Schwachstellen in VPN Clients
Tipp von transocean vor 4 TagenSicherheit2 Kommentare

Moin, es gibt Sicherheitslücken bei VPN Clients namhafter Hersteller, wie man hier lesen kann. Gruß Uwe

Sicherheit

Wikileaks-Gründer Julian Assange wurde festgenommen

Information von Frank vor 7 TagenSicherheit3 Kommentare

Wikileaks-Gründer Julian Assange wurde heute in London festgenommen. Die Botschaft Ecuadors, in der er seit sieben Jahren lebte, hat ...

Heiß diskutierte Inhalte
Tipps & Tricks
Verdammt voll erwischt
Frage von AlchimedesTipps & Tricks23 Kommentare

Folgende Mail habe ich auf meinem Freenet Account erhalten: Nun folgendes Problem: 1) Ich besuche Porno Seiten yep hat ...

Drucker und Scanner
Xerox 7328 muss jeden Tag neu installert werden
Frage von PN-SchrauberDrucker und Scanner20 Kommentare

hallo, ich habe in Problem mit einem unserer Drucker. Vorweg, die meisten unserer Netzwerkdrucker laufen über einen Druckserver, dieser ...

HTML
Google maps
Frage von jensgebkenHTML20 Kommentare

Hallo Gemeinschaft, hab mal ne Frage zu Maps - habe es hinbekommen, dass ich einen iframe link erstellen kann ...

Switche und Hubs
PC Verursach Probleme im Netzwerk
gelöst Frage von spoboeSwitche und Hubs16 Kommentare

Hallo zusammen, folgene Situation macht mich inzwischen ratlos: In unserem Betrieb ist ein Rechner über die Hausverkabelung an einem ...