如何将更新的记录移动到历史记录表中?

Beg*_*Pal 2 sql t-sql sql-server sql-server-2005

我有下表:

CREATE TABLE FE_USER
(
    userid int identity (321,4) CONSTRAINT userid_pk PRIMARY KEY,
    username varchar(40)
);
Run Code Online (Sandbox Code Playgroud)

其对应的历史表是

CREATE TABLE FE_USER_HIST
(
    userid int,
    username varchar(40),
    v_action varchar(50)
);
Run Code Online (Sandbox Code Playgroud)

每次在FE_USER表上发生插入或更新时,我都需要将这个新插入的记录或更新的记录输入到历史表中.

如何在t-sql中编写触发器?

这是我的pseducode,但我收到很多错误:

CREATE OR REPLACE TRIGGER user_to_hist
    AFTER UPDATE OR DELETE
    ON FE_USER
    FOR EACH ROW
    DECLARE
        v_action varchar(50);
    BEGIN
        v_action := CASE WHEN UPDATING THEN 'UPDATE' ELSE 'DELETE' END;
        INSERT INTO FE_USER_HIS(userid, username, v_action)
        SELECT :OLD.userid, :OLD.username, v_action
        FROM .......;
END;
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 5

CREATE OR REPLACE不幸的是,SQL Server不支持.您需要使用CREATEALTER依赖于您正在执行的操作.

它也没有行级触发器.所有受影响的行都可以在名为INSERTED或的伪表中使用DELETED

最简单的方法可能是2个独立的触发器.

对于插入

CREATE TRIGGER dbo.tr_i_FE_USER 
   ON  dbo.FE_USER 
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;
INSERT INTO FE_USER_HIST
SELECT userid,username, 'inserted' AS v_action
FROM INSERTED

END
Run Code Online (Sandbox Code Playgroud)

并为更新

CREATE TRIGGER dbo.tr_u_FE_USER 
   ON  dbo.FE_USER 
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;
INSERT INTO FE_USER_HIST
SELECT userid,username, 'updated' AS v_action
FROM INSERTED /*If you wanted the previous value instead
                 you could use FROM DELETED */

END
Run Code Online (Sandbox Code Playgroud)

只是跟进我在评论中提到的方法

CREATE TRIGGER dbo.tr_iud_FE_USER 
   ON  dbo.FE_USER 
   AFTER INSERT, UPDATE, DELETE
AS 
BEGIN
    SET NOCOUNT ON;

    INSERT INTO FE_USER_HIST
    SELECT 
    ISNULL(i.UserId,d.UserId) AS UserId,

    CASE WHEN i.UserId IS NULL THEN d.UserName
         ELSE i.UserName
    END AS UserName,

    CASE WHEN i.UserId IS NULL THEN 'deleted' 
         WHEN d.UserId IS NULL THEN 'inserted' 
         ELSE 'updated'
    END  AS v_action
    from INSERTED i FULL OUTER JOIN DELETED d 
    ON i.UserId = d.USerId
END
Run Code Online (Sandbox Code Playgroud)