#sql-server-2005 #tsql #triggers
#sql-server-2005 #tsql #триггеры
Вопрос:
Мне нужно иметь возможность отслеживать таблицу и реагировать сразу после вставки записи. В этой таблице нет поля идентификатора ITN, только уникальный идентификатор в качестве первичного ключа. Без каких-либо изменений существующих входных данных, SPS и т.д. Мне нужно иметь возможность находить последний вставленный идентификатор из триггера. Это то, что у меня есть (очевидно, не работает):
CREATE TRIGGER TR_UserInserted
ON Users
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
EXEC UserInserted (SELECT User_Id FROM INSERTED);
END
GO
Здесь я пытаюсь получить User_Id из последней вставленной записи в таблице Users и запустить его через UserInserted SP. Спасибо за помощь, я в тупике.
HLGEM сделал отличный вывод — даже при массовой вставке мне нужна только последняя вставленная запись — я знаю, что это странный запрос.
Комментарии:
1. Одна из причин, по которой ваш триггер не будет работать, заключается в том, что вы сделали очень неверное предположение, что во вставленной таблице будет только одна запись. Это неприемлемо в триггере. При вставке нескольких записей вам нужно, чтобы все записи выполнялись через хранимую процедуру, сохраненную пользователем? Или только последний?
2. что указывает на то, что он является последним?
3. Это моя проблема прямо здесь… У меня нет даты-времени или чего-либо еще, из чего можно было бы выйти. Есть ли что-нибудь, что я могу вызвать в триггере, который, возможно, вернет последнюю вставленную строку?
4. Используете ли вы, по крайней мере, NEWSEQUENTIALID() для создания GUID?
5. Я нашел простое решение — я смог просто добавить столбец идентификатора INT — теперь я могу это использовать…
Ответ №1:
Вам нужно изменить ваш триггер на fire ВМЕСТО INSERT. Переменная uniqueidentifier должна быть сгенерирована с использованием функции NEWID(). В инструкции INSERT в теле триггера столбцы должны быть указаны по порядку. Предполагая, что таблица определена таким образом:
CREATE TABLE Users (
First int,
User_Id uniqueidentifier PRIMARY KEY,
Third int,
Fourth int)
Тогда триггер:
CREATE TRIGGER TR_UserInserted ON Users
INSTEAD OF INSERT AS
BEGIN
DECLARE @newid uniqueidentifier = NEWID()
INSERT INTO Users
SELECT
First,
@newid,
Third,
Fourth
FROM inserted
EXECUTE UserInserted(@newid)
-- you can actually provide all the columns to UserInserted
END
Чтобы это работало должным образом, убедитесь, что таблица не имеет значения по умолчанию для первичного ключа как NEWID().