Pregunta Disparador de actualización de SQL Server (no es un problema exclusivo de inserción)


Tengo una mesa súper simple que se ve así:

CREATE TABLE [dbo].[TestTable](
[SomeColumn] [int] NOT NULL )

También tengo un disparador súper simple en otra mesa que se ve así:

ALTER TRIGGER [dbo].[trg_Audit_TableXYZ] ON [dbo].[TableXYZ] AFTER UPDATE

AS

INSERT INTO [dbo].[TestTable] Values (123)

Mi problema es que cuando se ejecuta el disparador, aparece el siguiente error:

Los valores de fila actualizados o eliminados no hacen que la fila sea única o alteran varias filas (2 filas).


9
2018-02-13 04:16


origen


Respuestas:


Añadir SET NOCOUNT ON a la parte superior de la definición del desencadenador. Esto suprimirá el mensaje de filas adicionales afectadas que emana del desencadenador y confunde a SSMS.

es decir

ALTER TRIGGER [dbo].[trg_Audit_TableXYZ] 
ON [dbo].[TableXYZ] 
AFTER UPDATE
AS
SET NOCOUNT ON
--Rest of trigger definition follows
INSERT INTO [dbo].[TestTable] Values (123)

19
2018-02-13 11:41



No puedo recrear ¿Esto está en conflicto con algún otro disparador o una restricción o algo así, tal vez? No lo sé.

Actualizar:

Como dijo Mikael, agregar una clave principal en TableXYZ evitará el problema. Solo ocurre cuando está modificando la tabla con SSMS. Gracias Mikael. Esto funciona:

create database testdb
go
use testdb

CREATE TABLE [dbo].[TestTable](
[SomeColumn] [int] NOT NULL)

CREATE TABLE [dbo].[TableXYZ](
[ID] [int] identity(1,1) primary key,
[SomeColumn] [int] NOT NULL )
go

create TRIGGER [dbo].[trg_Audit_TableXYZ] ON [dbo].[TableXYZ] AFTER UPDATE
AS
INSERT INTO [dbo].[TestTable] Values (123)
go

INSERT INTO [dbo].[Tablexyz] Values (4)
INSERT INTO [dbo].[Tablexyz] Values (5)
INSERT INTO [dbo].[Tablexyz] Values (6)

update tablexyz set somecolumn = 789
update tablexyz set somecolumn = 0

0
2018-02-13 06:28