菜鸟建了个sql库,有四个字段,报废日期,是否报废,使用状态,设备状态
<报废日期>是人工填入
<是否报废>根据报废日期与今天日期的比较判断 是 否
<使用状态>由人工填入 在用或者未用
设想的功能是,<设备状态>由触发器"判断设备状态"if update(使用状态),根据 <是否报废>的是/否 和 在用/未用 来自动给出状态值
(报废在用/报废未用/未报废在用/未报废未用)
问题来了,当*同一时间*插入一个记录时,设备状态始终=null,我发现在"判断设备状态"被触发时,<是否报废>
的值是NULL,所以不满足"判断设备状态"中的if判断条件,<设备状态>不会被触发器修改
而插入一个记录之后修改 此条记录 的<使用状态>,触发器"判断设备状态"就会实现设想功能
我设想的是,在插入一整条记录时,先让根据日期判断 是否报废的触发器工作,将 是/否 结果写入<是否报废>后,
再让"判断设备状态"触发器生效,也就是让判断报废的触发器在判断设备状态的触发器之前生效
求教大神,如何实现,或者有木有更好的办法?数据库菜鸟敬请指导啊
查到可以使用sp_settriggerorder,可我对sql server 2008还不太熟悉,怎么使用这个
系统存储过程,在哪儿添加或者修改呢?求教详细步骤,谢谢大家!
ALTER TRIGGER [dbo].[是否报废]
ON [dbo].[设备信息]
after insert,update
AS
IF update(报废时间)
begin
if (select 报废时间 from inserted)<getdate()
begin
UPDATE 设备信息 SET 是否报废='是'
WHERE 设备自编号 IN (SELECT 设备自编号 FROM inserted)
end
else
begin
UPDATE 设备信息 SET 是否报废='否'
WHERE 设备自编号 IN (SELECT 设备自编号 FROM inserted)
end
End
ALTER TRIGGER [dbo].[设备状态]
ON [dbo].[设备信息]
after insert,update
AS
if update (使用状态)
begin
if (select 是否报废 from inserted)='是' and (select 使用状态 from inserted)='在用'
UPDATE 设备信息 SET 设备状态='报废仍在用'
WHERE 设备自编号 IN (SELECT 设备自编号 FROM inserted)
if (select 是否报废 from inserted)='否' and (select 使用状态 from inserted)='在用'
UPDATE 设备信息 SET 设备状态='折旧中在用'
WHERE 设备自编号 IN (SELECT 设备自编号 FROM inserted)
if (select 是否报废 from inserted)='是' and (select 使用状态 from inserted)='未用'
UPDATE 设备信息 SET 设备状态='报废且未用'
WHERE 设备自编号 IN (SELECT 设备自编号 FROM inserted)
if (select 是否报废 from inserted)='否' and (select 使用状态 from inserted)='未用'
UPDATE 设备信息 SET 设备状态='折旧中未用'
WHERE 设备自编号 IN (SELECT 设备自编号 FROM inserted)
if (select 是否报废 from inserted)='是' and (select 使用状态 from inserted)='停用'
UPDATE 设备信息 SET 设备状态='停用注销'
WHERE 设备自编号 IN (SELECT 设备自编号 FROM inserted)
if (select 是否报废 from inserted)='否' and (select 使用状态 from inserted)='停用'
UPDATE 设备信息 SET 设备状态='停用折旧'
WHERE 设备自编号 IN (SELECT 设备自编号 FROM inserted)
if (select 是否报废 from inserted)is null
UPDATE 设备信息 SET 设备状态='报废未知'
WHERE 设备自编号 IN (SELECT 设备自编号 FROM inserted)
End
------解决方案--------------------
ALTER TRIGGER [dbo].[是否报废]
ON [dbo].[设备信息]
after insert,update
把after改为for
------解决方案--------------------
IF update(报废时间)是更新才返回true,insert的时候应该返回的是false吧
------解决方案--------------------
ALTER TRIGGER [dbo].[是否报废]
ON [dbo].[设备信息]
after insert,update
把after改为instead of
------解决方案--------------------
你这里业务需要 触发器吗。。
触发器用不好,麻烦大大。。建议不需要用。