【发布时间】:2014-10-15 17:07:51
【问题描述】:
我有一个存档和用户表。我的目标是跟踪用户表上的更改并将旧用户数据保存到存档中。
我已经触发了一个触发器,但它也应该忽略某些字段。
例如,我有 last_login_date,所以我不想为每个用户登录在存档中创建新条目。
如何添加和跟踪此类条件?
CREATE TRIGGER UserUpdateDataTrigger ON Users.[User]
FOR UPDATE
AS
BEGIN
SET NOCOUNT ON
DECLARE @User_id int
SELECT @User_id = id from inserted
-- Add an entry to archive
INSERT INTO
Users.Archive (name, email, user_id, user_type)
SELECT
u.name, u.email, u.id, u.user_type
FROM
Users.[User] u
WHERE u.id = @User_id
END
GO
我的新代码:
USE [SQL_Tutorial]
IF OBJECT_ID ('Users.UserUpdateDataTrigger', 'TR') IS NOT NULL
DROP TRIGGER Users.UserUpdateDataTrigger;
GO
/****** Object: Trigger [Users].[UserUpdateDataTrigger] Script Date: 2014-10-15 09:34:17 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [Users].[UserUpdateDataTrigger] ON [Users].[User]
FOR UPDATE
AS
BEGIN
SET NOCOUNT ON
-- Add an entry to archive
IF (UPDATE(name) OR UPDATE(email) OR UPDATE(user_type) OR UPDATE(is_active) OR UPDATE(country_id))
BEGIN
DECLARE @User_id int;
DECLARE @User_name varchar(max);
DECLARE @User_email varchar(max);
DECLARE @User_user_type int;
DECLARE @User_is_active bit;
DECLARE @User_country_id int;
SELECT @User_id = id from deleted
SELECT @User_name = name from deleted
SELECT @User_email = email from deleted
SELECT @User_user_type = user_type from deleted
SELECT @User_is_active = is_active from deleted
SELECT @User_country_id = country_id from deleted
INSERT INTO
Users.Archive (name, email, user_id, user_type, is_active, country_id)
VALUES
(@User_name, @User_email, @User_id, @User_user_type, @User_is_active, @User_country_id)
END
END
【问题讨论】:
-
用户表中的 last_login_date 字段是否可用?如果是,您是否要跟踪用户的 last_login_date,但不在存档表中添加新列?让我知道,如果我理解正确..
-
这是您所需要的,相应地添加您的列。 stackoverflow.com/questions/12137102/…
-
inserted可以包含 0、1 或 多个 行。SELECT @User_id = id from inserted存在根本缺陷。 -
Damien 所以我应该单独声明每个字段,然后根据字段更改插入新数据?如果我理解正确,我做了'SELECT @User_id = id from inserted' 是错误的、懒惰的方式;)?
标签: sql sql-server sql-server-2008