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)
CREATE OR REPLACE不幸的是,SQL Server不支持.您需要使用CREATE或ALTER依赖于您正在执行的操作.
它也没有行级触发器.所有受影响的行都可以在名为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)
| 归档时间: |
|
| 查看次数: |
3511 次 |
| 最近记录: |