更新触发器

时间:2014-12-07 02:45:42

标签: sql sql-server triggers

我的表格Prescription_Medicine包含IDNumOfDrugnumOfUnit列。

我想编写一个触发器,如果​​numOfUnit小于零,程序会自动将其设置为1。

这是我尝试过的,但这是错误的。

IF OBJECT_ID('trigger2_9', 'TR') is not null
    DROP trigger trigger2_9;
GO

CREATE TRIGGER trigger2_9 ON Prescription_Medicine
AFTER INSERT
AS
IF EXISTS ( select Prescription_Medicine.NumOfUnits
            from Prescription_Medicine
            JOIN inserted AS i 
            ON Prescription_Medicine.NumOfUnits = i.NumOfUnits
            group by Prescription_Medicine.NumOfUnits
            having  Prescription_Medicine.NumOfUnits <= 0
          )
BEGIN

    alter table Prescription_Medicin
    update Prescription_Medicin
        set inserted.numOfUnits = 1;
ROLLBACK TRANSACTION;
RETURN 
END;

我该怎么做!?

3 个答案:

答案 0 :(得分:1)

您的update需要更新表格,而不是inserted。此外,update的语法不涉及alter table(无论如何通常不允许在触发器中使用)。

IF OBJECT_ID('trigger2_9', 'TR') is not null
    DROP trigger trigger2_9;
GO

CREATE TRIGGER trigger2_9 ON Prescription_Medicine
AFTER INSERT
AS
BEGIN
    IF EXISTS ( select pm.NumOfUnits
                from Prescription_Medicine pm JOIN
                     inserted AS i 
                     on pm.NumOfUnits = i.NumOfUnits
                group by pm.NumOfUnits
                having pm.NumOfUnits <= 0
              )
    BEGIN
        update Prescription_Medicin
            set numOfUnits = 1;
    END;

END;

但是,我想知道你是否可以通过“检查”约束和计算列来做你想做的事。

答案 1 :(得分:1)

像这样更改Trigger。触发器中Alter Statement不需要update一个没有意义的表。

IF EXISTS (SELECT 1 
           FROM   inserted 
           WHERE  numofunits <= 0) 
  UPDATE A 
  SET    numOfUnits = 1 
  FROM   prescription_medicin A 
         JOIN inserted I 
           ON A.id = PM.id 
  WHERE  i.numofunits <= 0 

考虑ID是标识列

答案 2 :(得分:0)

我认为你不需要改变表格......&#39;

当您更改表本身的定义时(即添加或删除列),将使用该语句。