【发布时间】:2015-05-24 05:09:48
【问题描述】:
我已经环顾四周,但还没有找到我正在寻找的东西。抱歉,如果这是一个重复的问题,我没有看到符合我需求的问题。
我有一个应用程序表[UserInRoles],它包含两列[UserID] 和[RoleID]。当用户切换到不同的角色时,应用程序会使用新用户的插入和更新来管理此表。
我有一个历史记录表 [UserRoleHistory],它有 4 列 [UserID]、[RoleID_New]、[RoleID_Old]、[DateOfChange]
我需要弄清楚的是如何创建一个触发器,该触发器将在每次[UserInRoles].[RoleId] 更改时向[UserRoleHistory] 插入一个新行。我希望将旧 RoleId 存储在 [RoleId_Old] 列中,并将新 RoleId 存储在 [RoleId_New] 列中。还需要存储[UserId] 并使用GETDATE() 为[DateOfChange] 增加价值
另外,(这可能)我希望触发器能够注意到何时对应用程序表 [UserInRoles] 进行了插入并将数据 [UserId], [RoleId],GETDATE() 保存到历史表中为 @987654337 @ 并保留 [RoleId_Old] as a null 值。
我对触发器非常陌生,不知道如何继续。如果我搞砸了触发器,我没有权限删除它,所以我还没有尝试创建一个。只是想先获得一些专家意见。提前感谢所有花时间阅读和回答/评论此问题的人。
****编辑**** 我已经使用了你的建议,这就是我最终想出的。此触发器包含我最初要求的更多信息,但在使用它后发现我在历史记录表中想要的信息很容易获得,我按照我认为合适的方式添加了它。
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
【问题讨论】:
标签: sql-server tsql triggers sql-server-2012 dynamic-sql