2014-12-26 74 views
0

我有一个包含id,user_Name和password的表。我想创建触发器,当密码更改时将触发。如何在密码更改时触发sql触发器

假设表为:

create table reg 
(
    id int identity(1,1) primary key, 
    userName varchar(100), 
    pass varchar(100) 
) 

,我想在保存userName, password, changeDate见下表

create table regBackUp 
(
    id int identity(1,1), 
    regId foreign key references reg(id), 
    oldPass varchar(100), 
    changeDate date 
) 

回答

0

那么,你需要在reg表中创建触发器after update

在该触发器中,您需要写入表regBackUp从表deleted中选择的记录。
这是触发器中可用的特殊表格,它将在更新前保留reg表的值。

有关create trigger表达式的语法的参考,请参阅MSDN

0

使用此。 TRIGGER

您可以从DELETED

CREATE TRIGGER trgTest ON regFOR UPDATE 
AS 
BEGIN 
    IF UPDATE(pass) 
    BEGIN 
     DECLARE @id AS INT 
     DECLARE @pass AS varchar(100) 

     SELECT @id = ID, @pass = pass FROM DELETED 

     INSERT INTO regBackUp (regId, oldPass, changeDate) 
       VALUES (@id, @pass, GETDATE()) 
    END 
END 
0

使用得到旧值与Update()功能找出列是否更新或没有。从文档。

指示是否对表或视图的指定 列执行INSERT或UPDATE尝试。 UPDATE()用于Transact-SQL INSERT或UPDATE触发器的主体 中的任何位置,以测试触发器 是否应执行某些操作。

创建一个After Update trigger这样。

CREATE TRIGGER reg_pass_trg 
ON reg 
after UPDATE 
AS 
    BEGIN 
     IF UPDATE(pass) --Works only when pass is mentioned in update statement 
     INSERT INTO regBackUp 
        (regId,oldPass,changeDate) 
     SELECT ID,pass,Getdate() 
     FROM deleted 
    END 
0
INSERT INTO namepassback 
      (username, 
      pass, 
      [date]) 
SELECT username, 
     pass, 
     Getdate() 
FROM namepass 
WHERE id = 1 

使用上面的查询,将工作一样,而无需创建触发器

+1

这种“解决方案”,它完全无关你的问题。例如,它总是选择'id = 1'的记录 - 并且不检查是否更新。 –

+0

你的答案根本没有任何意义,你在哪里检查“传递”列是**更新**还是不总是'Id = 1' –