日期:2014-05-17  浏览次数:20518 次

求修改一个触发器

ALTER TRIGGER TRIGGER_PREALARM_INSERT ON [A]   
FOR INSERT AS
BEGIN

    INSERT prealarmTmp
    (
      itemNodeRecID,
      value,
      careDateTime,
      clientID,
      familyNM,
      firstNM
    )    
SELECT 
  tc.ItemNodeRecID,
  tc.Value,
  tct.CareDateTime,
  tct.ClientID,
  mc.ClientFamilyName,
  mc.ClientFirstName
FROM Inserted tc
LEFT JOIN CareTimeline tct ON
  tc.CareID = tct.CareID
LEFT JOIN ClientData mc ON
  mc.ClientID = tct.ClientID
LEFT JOIN prealarmCode yp ON
  tc.ItemNodeRecID = yp.itemNodeRecID
WHERE
  tc.ModifyState = 1
AND tct.ModifyState = 1
AND (yp.itemType = 1 AND (CAST(tc.Value AS float)  < CAST(yp.value1 AS float)
 OR CAST(tc.Value AS float) > CAST(yp.value2 AS float))
OR  (yp.itemType = 2 AND CAST(tc.Value AS float) = CAST(yp.value3 AS float)))

END 


现在这段是A的一个触发器,在增加一条记录的时候,会去做一个查询,如果符合条件,就插入到prealarmTmp表里。现在如果我想修改一下,要是A表删除记录的话,prealarmTmp表有条数据的话,也同时删掉。
如果A表更新的时候,满足插入查询的话,如果prealarmTmp表记录已经存在,就做更新,要是不存在,就做插入,要是插入查询不满足的话,就把之前那条记录删除。
可以在写在这 一个里面吗?

------解决方案--------------------
引用:
Quote: 引用:

感觉做个主外键关系即可。
A 表主表,prealarmTmp表里面还有A表外键即可。 级联更新或删除。

插入的话直接用你这个触发器即可。
级联更新好像不行
因为tc.Value在插入的时候,可能不满足条件。但是更新后,满足条件了,那就要把它查到prealarmTmp去


那就做判断吧

if exists(select 1 from inserted) and not exists(select 1 from deleted)  --插入
--.....
if not exists(select 1 from inserted) and  exists(select 1 from deleted) --删除
--....
if exists(select 1 from inserted) and  exists(select 1 from deleted) --更新
--....


里面写你的逻辑处理代码即可