ukulele
Datenbank-Guru
- Beiträge
- 5.306
Ich habe mal ein Test-Szenario aufgesetzt, Tabelle tmp und Inhalt:
pk var bit
------------------------------------ -------------------------------------------------- -----
7915F803-C54D-4552-9146-701559FA66AA Test 0
5951FFBA-22F4-46B5-B861-B786A8A4BE1C Test 0
9EF696E6-E8DD-40FB-A241-1CE6E97A16F9 Test 0
58F0A37A-526E-46EF-A8E4-AB6666D4558B Test 0
59361A39-B0BD-4930-B801-BB7FFEE10EA9 Test 1
98F2745B-EB8D-44E1-B4F7-21ECB4894FF9 Test 1
694117F2-5FA8-4E83-AC17-94B17D5C1C5A Test 1
0255AB67-47F1-453B-8629-3C731FBD6D96 Test 1
5F7869AF-F26A-4323-BF30-203CF0A09553 Test NULL
600F7B40-C033-4AB7-B81A-26418F3F0E9E Test NULL
31243BD7-A6E8-4049-B942-1D3422650A21 Test NULL
932EF3E7-AFA2-4C03-B603-6F733BD3CD69 Test NULL
(12 Zeile(n) betroffen)
Auf der Tabelle läuft ein Trigger:
Nun versuche ich folgenden Code auszuführen:
pk var bit
------------------------------------ -------------------------------------------------- -----
7915F803-C54D-4552-9146-701559FA66AA Test 0
5951FFBA-22F4-46B5-B861-B786A8A4BE1C Test 0
9EF696E6-E8DD-40FB-A241-1CE6E97A16F9 Test 0
58F0A37A-526E-46EF-A8E4-AB6666D4558B Test 0
59361A39-B0BD-4930-B801-BB7FFEE10EA9 Test 1
98F2745B-EB8D-44E1-B4F7-21ECB4894FF9 Test 1
694117F2-5FA8-4E83-AC17-94B17D5C1C5A Test 1
0255AB67-47F1-453B-8629-3C731FBD6D96 Test 1
5F7869AF-F26A-4323-BF30-203CF0A09553 Test NULL
600F7B40-C033-4AB7-B81A-26418F3F0E9E Test NULL
31243BD7-A6E8-4049-B942-1D3422650A21 Test NULL
932EF3E7-AFA2-4C03-B603-6F733BD3CD69 Test NULL
(12 Zeile(n) betroffen)
Auf der Tabelle läuft ein Trigger:
Code:
ALTER TRIGGER [dbo].[tmp_test]
ON [dbo].[tmp]
AFTER UPDATE, INSERT
AS
IF UPDATE([bit])
AND ( SELECT [var]
FROM INSERTED ) NOT IN ( 'SQL Trigger','SQL Script' )
BEGIN
SET NOCOUNT ON;
SELECT *
FROM INSERTED
END
GO
Nun versuche ich folgenden Code auszuführen:
Code:
UPDATE tmp
SET [bit] = 1,
[var] = 'SQL Trigger'
WHERE [bit] = 0
OR [bit] IS NULL
Ganz offensichtlich liefert SELECT [var] FROM INSERTED mehr als eine Zeile zurück. Bisher nahm ich immer an, werden mit einem SQL Statement in einer Tabelle mehrere Zeilen aktualisiert dann feuert der Trigger nur in der ersten Zeile. So wie es aussieht feuert er zwar nur einmal aber in der INSERTED Tabelle stehen dann alle aktualisierten Einträge. Lag ich bisher einfach nur falsch? Kennt jemand eine gute Quelle zum nachlesen?Meldung 512, Ebene 16, Status 1, Prozedur tmp_test, Zeile 8
Die Unterabfrage hat mehr als einen Wert zurückgegeben. Das ist nicht zulässig, wenn die Unterabfrage auf =, !=, <, <=, > oder >= folgt oder als Ausdruck verwendet wird.
Die Anweisung wurde beendet.