我的表格Prescription_Medicine
包含ID
,NumOfDrug
和numOfUnit
列。
我想编写一个触发器,如果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;
我该怎么做!?
答案 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;
当您更改表本身的定义时(即添加或删除列),将使用该语句。