Триггер вызывается на все строки в базе данных - PullRequest
4 голосов
/ 17 июня 2011

Я написал триггер, который хочу использовать для добавления даты в столбец записи, чтобы можно было отслеживать вставку элемента.

Существует большое количество вызываемых вставок (около 20000), и я заметил, что триггер будет обновлять все столбцы InsertDate, связанные с каждым элементом, каждый раз, когда добавляется новый элемент. Как я могу убедиться, что это происходит с элементом, вставляемым только один раз.

Мой триггер выглядит следующим образом:

 SET ANSI_NULLS ON
 SET QUOTED_INDENTIFIER ON
 GO


 CREATE TRIGGER [InsertDate_Item]
    ON [dbo].[ItemHolder]
    AFTER INSERT
    NOT FOR REPLICATION
 AS
 UPDATE ItemHolder SET InsertDate = GETDATE()

Любая помощь будет высоко ценится.

Спасибо

Ответы [ 5 ]

7 голосов
/ 17 июня 2011

Вам нужно ограничить строки вставленными ... используя виртуальную таблицу триггеров INSERTED

 CREATE TRIGGER [InsertDate_Item]
    ON [dbo].[ItemHolder]
    AFTER INSERT
    NOT FOR REPLICATION
 AS
 SET NOCOUNT ON
 UPDATE IH
 SET InsertDate = GETDATE()
 FROM
    ItemHolder IH
    JOIN
    INSERTED INS ON IH.keycol = INS.keycol
 Go

Одно: лучше вместо этого добавить таблицу в таблицу по умолчанию.Нет необходимости в триггере

ALTER TABLE ItemHolder ADD
CONSTRAINT DF_ItemHolder_InsertDate DEFAULT (GETDATE()) FOR InsertDate
4 голосов
/ 17 июня 2011

Если вы вставляете записи в таблицу, почему бы не сделать для поля InsertDate значение по умолчанию GetDate ()? Это позволяет избежать триггера.

2 голосов
/ 17 июня 2011

Я бы пошел о том, что вы пытаетесь сделать без триггера.Просто установите значение столбца по умолчанию в GetDate ().

0 голосов
/ 18 июня 2011

обновление ih set ih.insertdate = GetDate () из держателя элемента ih вставлено внутреннее соединение i в ih.itemholderid = i.itemholderid

0 голосов
/ 18 июня 2011

изменение:

UPDATE ItemHolder SET InsertDate = GETDATE()

до:

UPDATE ItemHolder SET InsertDate = GETDATE() WHERE InsertDate IS NULL

Вышеприведенное установит InsertDate, только если оно равно нулю, и вы все еще хотите использовать триггер. Конечно, это предполагает, что значение по умолчанию для InsertDate равно нулю. Если это не так, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...