Trigger und UNION in Derived Table

18/03/2009 - 15:17 von Thomas Schremser | Report spam
Hallo allerseits!

Ich möchte Änderungen, die an einer Tabelle im SQL Server 2000 vorgenommen
werden, in einer separaten Tabelle protokollieren. Folgender Trigger
funktioniert sowohl dann, wenn ich im SSMS etwas àndere als auch, wenn die
Änderung über meine VB6-Applikation erfolgt:

CREATE TRIGGER LogInsuranceChangesTrigger
ON InsuredPersons
FOR INSERT, UPDATE
AS
DECLARE
@ChangeDate smalldatetime

SET @ChangeDate = GETDATE()

INSERT INTO InsuredPersonsHistory
(
ChangeType,
ChangeDate,
ChangeUser,
<weitere Felder>
)
SELECT
'D' AS ChangeType,
@ChangeDate,
SYSTEM_USER AS ChangeUser,
<weitere Felder>
FROM deleted

INSERT INTO InsuredPersonsHistory
(
ChangeType,
ChangeDate,
ChangeUser,
<weitere Felder>
)
SELECT
'I' AS ChangeType,
@ChangeDate,
SYSTEM_USER AS ChangeUser,
<weitere Felder>
FROM inserted

Wenn ich aber beide INSERT-Statements so über einen UNION zusammenfassen
möchte

INSERT INTO InsuredPersonsHistory
(
ChangeType,
ChangeDate,
ChangeUser,
<weitere Felder>
)
SELECT
ChangeType,
ChangeDate,
ChangeUser,
<weitere Felder>
FROM
(
SELECT
'D' AS ChangeType,
@ChangeDate,
SYSTEM_USER AS ChangeUser,
<weitere Felder>
FROM deleted
UNION SELECT
'I' AS ChangeType,
@ChangeDate,
SYSTEM_USER AS ChangeUser,
<weitere Felder>
FROM inserted
) X

dann funktioniert das bei Änderungen im SMSS nach wie vor, in meiner
Applikation erhalte ich aber den Fehler

-2147467259 (0x80004005):
Die Schlüsselspalteninformationen sind ungenügend oder inkorrekt.
Es sind zu viele Zeilen von der Aktualisierung betroffen.

Grundsàtzlich komme ich mit den zwei getrennten INSERT-Statements zwar aus,
mich würde aber trotzdem interessieren wo hier ein Problem liegt. Hat jemand
eine Idee?

TIA

Grüße
Thomas

Any problem in computer science can be solved with another layer
of indirection. But that usually will create another problem.
David Wheeler
 

Lesen sie die antworten

#1 Elmar Boye
18/03/2009 - 16:02 | Warnen spam
Thomas Schremser schrieb:
Hallo allerseits!

Ich möchte Änderungen, die an einer Tabelle im SQL Server 2000 vorgenommen
werden, in einer separaten Tabelle protokollieren. Folgender Trigger
funktioniert sowohl dann, wenn ich im SSMS etwas àndere als auch, wenn die
Änderung über meine VB6-Applikation erfolgt:

CREATE TRIGGER LogInsuranceChangesTrigger
ON InsuredPersons
FOR INSERT, UPDATE
AS



füge hier ein
SET NOCOUNT ON


DECLARE
@ChangeDate smalldatetime

[...]
dann funktioniert das bei Änderungen im SMSS nach wie vor, in meiner
Applikation erhalte ich aber den Fehler

-2147467259 (0x80004005):
Die Schlüsselspalteninformationen sind ungenügend oder inkorrekt.
Es sind zu viele Zeilen von der Aktualisierung betroffen.



dann sollte es auch in der Anwendung funktionieren.

Denn ohne das SET NOCOUNT ON interpretiert die Anwendung
die Anzahl der Zeilen der Einfügeoperation
(also u. U. zwei bei UPDATE) als einen Fehler.

Bei SET NOCOUNT ON bekommt sie nur die Anzahl der eigentlichen
Operation zu sehen. (SSMS interessiert das nicht, deswegen
siehst Du da keinen Fehler).

Gruß Elmar

Ähnliche fragen