SQL Server 2008触发器

SQL Server 2008触发器

问题描述:

我不是新来的SQL Server,但我是触发器的新手。我已经阅读了一些教程,说实话,语法仍然有点混乱。SQL Server 2008触发器

我试图创建一个触发器,检查字段被设置为特定的值,然后更新同一个表中的另一个字段。

希望下面的代码会自己说话,问题是显而易见的人

ALTER TRIGGER updateCompletedDate 
ON projects 
AFTER INSERT, UPDATE 
AS 
    IF UPDATE(status) 
    BEGIN 
     UPDATE projects 
     SET date_complete = GETDATE() 
     FROM inserted 
     WHERE inserted.status = 'Completed' 
      AND projects.date_complete = '1900-01-01' 
END 

上面的代码没有我希望的效果。当我更新一行并将状态设置为Completed时,date_complete列保持默认值1900-01-01

感谢

按marc_s的意见我修改了扳机,现在工作的下面。修复是在where子句中增加了AND inserted.id = projects.id

ALTER TRIGGER updateCompletedDate 
ON projects 
AFTER INSERT, UPDATE 
AS 
IF UPDATE(status) 
BEGIN 
    UPDATE projects 
    SET projects.date_complete = GETDATE() 
    FROM inserted 
    WHERE inserted.status = 'Completed' 
    AND inserted.id = projects.id 
    AND projects.date_complete = '1900-01-01' 
END 

谢谢大家。

+1

我不看你怎么是*连接*在'插入更新所插入的那些行/ '您的'Projects'表中的行的伪表。在'WHERE'子句中应该有'inserted.ID = projects.ID'之类的东西。另外:'date_complete'是否真的是该值,或者是数据库中的'NULL',并且在GUI中显示为'1900-01-01'?另外:请仔细阅读** DATETIME栏,因为它们还包含**时间**部分! – 2014-12-03 09:49:34

+1

首先尝试使用没有条件的触发器“AND projects.date_complete ='1900-01-01'”。如果工作完美,那么问题在于日期比较。 – Veera 2014-12-03 09:51:02

+0

干杯家伙。 marc_s - 日期字段默认为'1900-01-01'。不为null。就像我说的,我对触发器很陌生,所以我会在where子句中查看inserted.id = projects.id比较。维拉 - 谢谢我也会考虑这一点。 – Urbley 2014-12-03 09:59:09

我看不出你在你的Projects表连接在Inserted伪表更新到行被插入的那些行/。应该有类似

inserted.ID = projects.ID 

或类似的东西WHERE子句中:

UPDATE p 
SET 
    p.date_complete = GETDATE() 
FROM 
    dbo.Projects p 
INNER JOIN 
    inserted i ON inserted.id = projects.id 
WHERE 
    i.status = 'Completed' 
    AND p.date_complete = '1900-01-01' 
+0

虽然我还没有尝试上面的例子,但我仍然将其标记为答案,因为您关于链接插入的表和项目表的原始评论是解决方案。 – Urbley 2014-12-03 14:56:27

尝试下面的触发器更改。我只做了一些小的改变。

ALTER TRIGGER updateCompletedDate 
ON projects 
AFTER INSERT, UPDATE 
AS 
BEGIN 
    IF UPDATE(status) 
    BEGIN 
     DECLARE @status AS VARCHAR(20) 
     DECLARE @ID AS INT 

     SELECT @status = status, @ID = ID FROM INSERTED 

     UPDATE projects 
     SET date_complete = GETDATE() 
     WHERE @status = 'Completed' 
     AND id = @ID 
     AND CONVERT(CHAR(10), date_complete, 101) = '1900-01-01' 
    END 
END 
+0

嗨Veera这不适用于我,但不幸的是,但基于marc_s的评论,我设法让它工作。非常感谢你。我现在编辑该问题以包含修复程序。 – Urbley 2014-12-03 10:12:01