Я много оборачивался и еще не нашел то, что я ищу. Извините, если это дублированный вопрос, я не видел того, что соответствовало моим потребностям.SQL Trigger для обновления/вставки в logTable на основе обновлений и вставок в ApplicationTable
У меня есть таблица приложений [UserInRoles]
, которая содержит 2 столбца [UserID]
и [RoleID]
. Приложение управляет этой таблицей с помощью вложений для новых пользователей и обновлений, когда пользователь переключается на другую роль.
У меня есть история Таблица [UserRoleHistory], который имеет 4 колонки [UserID]
, [RoleID_New]
, [RoleID_Old]
, [DateOfChange]
Что мне нужно, чтобы выяснить, как создать триггер, который будет вставить новую строку в [UserRoleHistory]
каждый раз [UserInRoles].[RoleId]
изменения. Я хочу, чтобы старый RoleId хранился в столбце [RoleId_Old]
, а новый RoleId хранился в столбце [RoleId_New]
. Также [UserId]
необходимо хранить и GETDATE()
используется для добавления значения в [DateOfChange]
Кроме того, (это возможно) Я хотел бы на курок, чтобы заметить, когда вставка выполнена в таблице приложения [UserInRoles]
и сохранить данные [UserId], [RoleId],GETDATE()
в таблицу истории [UserId], [RoleId_New] , GETDATE()
и оставьте значение [RoleId_Old] as a null
.
Я очень новичок в триггерах и не уверен, как действовать дальше. У меня нет прав на удаление триггера, если я его испортил, поэтому я еще не пытался его создать. Просто хотел сначала получить экспертный ввод. Заранее благодарим всех и всех, кто тратит время на чтение и ответ на этот вопрос.
**** EDIT **** Я использовал ваши рекомендации, и это то, что я, наконец, придумал. У этого триггера есть немного больше информации, о которой я изначально просил, но после работы с ним и нашел, что информация, которую я хотел в таблице истории, была легкодоступна, я добавил ее, как я счел нужным.
CREATE TRIGGER [dbo].[UserInRoles_Insert_Delete_Update] ON [dbo].[UsersInRoles]
AFTER INSERT,DELETE,UPDATE
AS
IF (SELECT COUNT(*) FROM inserted) > 0
BEGIN
IF (SELECT COUNT(*) FROM deleted) > 0
BEGIN
-- update!
INSERT INTO [dbo].[UserRole_History](WinNTLogin,UserID,RoleID_Old,RoleID_New,RoleName,DateOfChange,Operation)
SELECT (select distinct[LoweredUserName] from [dbo].[Users]
where (inserted.UserId = Users.UserId) or (deleted.UserId = Users.UserId))
,CASE
WHEN inserted.UserID IS NOT NULL THEN inserted.UserID
ELSE deleted.UserID
END
,deleted.RoleID
,inserted.RoleID
,(select distinct[RoleName] from [dbo].[Roles]
where (inserted.RoleId = Roles.RoleId) or (deleted.RoleId = Roles.RoleId))
,GETDATE()
,'U'
FROM inserted
FULL JOIN deleted
ON inserted.UserID = deleted.UserID
END
ELSE
BEGIN
-- insert!
INSERT INTO [dbo].[UserRole_History](WinNTLogin,UserID,RoleID_Old,RoleID_New,RoleName,DateOfChange,Operation)
SELECT (select distinct[LoweredUserName] from [dbo].[Users]
where (inserted.UserId = Users.UserId) or (deleted.UserId = Users.UserId))
,CASE
WHEN inserted.UserID IS NOT NULL THEN inserted.UserID
ELSE deleted.UserID
END
,deleted.RoleID
,inserted.RoleID
,(select distinct[RoleName] from [dbo].[Roles]
where (inserted.RoleId = Roles.RoleId) or (deleted.RoleId = Roles.RoleId))
,GETDATE()
,'I'
FROM inserted
FULL JOIN deleted
ON inserted.UserID = deleted.UserID
END
END
ELSE
BEGIN
-- delete!
INSERT INTO [dbo].[UserRole_History](WinNTLogin,UserID,RoleID_Old,RoleID_New,RoleName,DateOfChange,Operation)
SELECT (select distinct[LoweredUserName] from [dbo].[Users]
where (inserted.UserId = Users.UserId) or (deleted.UserId = Users.UserId))
,CASE
WHEN inserted.UserID IS NOT NULL THEN inserted.UserID
ELSE deleted.UserID
END
,deleted.RoleID
,inserted.RoleID
,(select distinct[RoleName] from [dbo].[Roles]
where (inserted.RoleId = Roles.RoleId) or (deleted.RoleId = Roles.RoleId))
,GETDATE()
,'D'
FROM inserted
FULL JOIN deleted
ON inserted.UserID = deleted.UserID
END
GO