SQL-EXPRESS 2005: Problem mit Trigger

19/01/2010 - 14:00 von Gerrit Kuhlendahl | Report spam
Moinsen!

Ich habe bei einer Tabelle den folgenden Trigger, der zur ref. Integritàt
Werte in einer anderen Datenbank auf deren Existens prüft.

Gebe ich im Management-Studio in der Tabellenansicht Daten hàndisch
in die Tabelle, klappt alles wunderbar, auch wenn ich aus einer SP Daten
schreibe, klappt das hervorragend. Wenn diese SP jedoch wiederum in
einer anderen SP aufgerufen wird, làuft der Trigger bereits in den ersten
IF-Zweig, obwohl die entsprechenden Daten definitiv in der abgefragten
Tabelle vorhanden sind!!!

Hier der Trigger:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ON [dbo].[tblCltCmts]
AFTER INSERT,UPDATE
AS
BEGIN
SET NOCOUNT ON;

DECLARE @RC AS INT, @X as Int

Set @RC = 0

IF (SELECT COUNT(*)
FROM
TmxUsrCtrl.dbo.tblClients AS C, inserted
WHERE
C.ID = inserted.fkClientID) = 0
BEGIN
Print 'Keine gültige ClientID'
SET @RC = 1
END
ELSE
BEGIN

IF (SELECT COUNT(*)
FROM
TmxUsrCtrl.dbo.tblUser AS U, inserted
WHERE
U.ID = inserted.RowUser) = 0
BEGIN
Print 'Keine gültige Benutzer-ID (RowUser)'
SET @RC = 1
END
ELSE
BEGIN
IF (SELECT COUNT(*)
FROM
TmxUsrCtrl.dbo.tblUser AS U, inserted
WHERE
U.ID = inserted.DataUser) = 0
BEGIN
Print 'Keine gültige Benutzer-ID (DataUser)'
SET @RC = 1
END
END
END
IF @RC<>0
BEGIN
Print 'Test1'
RAISERROR ('Triggerfehler',0,1) WITH SETERROR
END
END

=
Schreibe ich mit der folgenden SP in die Tabelle (aus dem Managementstudio heraus)
làuft auch alles klasse. Hier die relevanten Auszüge aus der SP:


SET @UpdateFlg = 0

IF @RowID IS NULL
BEGIN
BEGIN TRANSACTION
SET @RowID = (SELECT ISNULL(MAX(ID),0) FROM tblCltCmts)
SET @ErrNR=@@ERROR


IF @ErrNr <> 0
BEGIN
ROLLBACK TRANSACTION
SET @RowNr = 0
SET @ResResult = 1 -- neue Reserv.-ID konnte nicht ermittelt werden.
END
ELSE
BEGIN
SET @RowID = @RowID +1

INSERT INTO tblCltCmts (
ID,
RowState,
RowUser,
RowComp,
RowProg
) VALUES (
@RowID,
-1,
@RowUser,
@RowComp,
@RowProg
)
IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION
SET @RowNr=0
SET @ResResult = 2 -- Schreiber der Res.-werte bei Neuanlage nicht möglich.
END
ELSE
BEGIN
COMMIT TRANSACTION
SET @RowNr = @RowID
SET @ResResult = 0
END
END
END
==
Nun aber kommt der Haken: Rufe ich die obige SP in einer anderen SP auf (mit den
gleichen Parametern wie beim Aufruf im Management-Studio), dann làuft der Trigger
gleich in den ersten IF-Zweig, obwohl der zu prüfende Wert in der anderen Tabelle
definitiv vorhanden ist.

Nachfolgend der Aufruf in der zweiten SP:


@RowID as INT = NULL,

@fkClientID as Int =0,
@ChildOf as Int = NULL,
@FirstDate as DateTime ='01.01.1900',
@LastDate as DateTime ='01.01.2100',
@ValidUpTo as DateTime ='01.01.2100',
@Changes as Int = NULL,
@MsgTyp as Int = 0,
@Title as nVarChar(128) = '',
@Comment as nVarChar(max) ='',
@IsToEdit as Bit = 1,
@Locked as Bit = 0,

@DeleteData AS INT = 0,
@DataUser as INT=0,
@DataComp as nVarChar(128)=Null,
@DataProg as nVarChar(128)=NULL,
@RowNr as INT = 0 OUTPUT,
@ResRet AS INT = 0 OUTPUT,
@ResMsg as nVarChar(256)='Kein Fehler' OUTPUT

AS
BEGIN
SET NOCOUNT ON;

DECLARE @LangID AS INT

SELECT @LangID = ISNULL(ValInt,1031) FROM tblSysExDbSettings WHERE Grp=3 AND GrpID=1

SET @ResRet = 0
SET @ResMsg = dbo.ufct_GetLangErrMsg(@ResRet,@LangID)




IF @RowID IS NOT NULL
BEGIN
IF @RowID < 1
BEGIN
SET @RowID = NULL -- Nur, wenn keine IDs kleiner 1 erlaubt sind!
END
END


DECLARE @ResResult as INT, @ResRowNr as INT

IF @ChildOf = 0
BEGIN
SET @ChildOf = NULL
END
print 'starte Reservierung'
print 'RowID ist gleich: ' + ISNULL(cast(@RowID as nvarchar(20)),'NULL')
print 'DataUser ist gleich: ' + ISNULL(cast(@DataUser as nvarchar(20)),'NULL')
print 'DataComp ist gleich:' + ISNULL(@DataComp,'NULL')
print 'DataProg ist gleich:' + ISNULL(@DataProg,'NULL')

EXECUTE dbo.usp_tblCltCmts_Reserve @RowID,@DataUser,@DataComp,@DataProg,@ResRowNr, @ResResult

print 'ResResult ist gleich ' + cast(@ResResult as nvarchar(20))

IF @ResResult<>0
BEGIN
SET @ResRet = @ResResult
SET @ResMsg = dbo.ufct_GetLangErrMsg(@ResRet,@LangID)
Return 1
END


Kann mir jemand dieses Verhalten erklàren? Hat jemand eine Idee, wie ich das abstellen
kann...?

Viele Grüße

Gerrit

KUH-SOFT - Die Software von glücklichen Programmierern
 

Lesen sie die antworten

#1 Elmar Boye
19/01/2010 - 18:23 | Warnen spam
Hallo Gerrit,

"Gerrit Kuhlendahl" schrieb ...
Ich habe bei einer Tabelle den folgenden Trigger, der zur ref. Integritàt
Werte in einer anderen Datenbank auf deren Existens prüft.



Könntest Du bitte noch die CREATE TABLE Anweisungen für die relevanten
Tabellen mitliefern. Denn irgendwas scheint mir nicht zusammenzupassen:

Im Trigger verwendest Du fkClientID
FROM
TmxUsrCtrl.dbo.tblClients AS C, inserted
WHERE
C.ID = inserted.fkClientID) = 0

das findet sich spàter aber nicht in der INSERT Anweisung.

Danach kann man sich über auch über das nicht ganz saubere
Transaktionhandling uam. besser unterhalten.

Gruß Elmar

Ähnliche fragen