写了两个触发器,代码如下:
USE SQL_HB_JXC
GO
CREATE TRIGGER Trig_A进货发票单_D001C5进货发票单_INSERT
ON A进货发票单
AFTER INSERT
ASIF ((SELECT 归档 FROM INSERTED) = 'True') AND ((SELECT 价格审核 FROM INSERTED) = 'True')
BEGIN
INSERT INTO [SQL_HB_D001]..C5进货发票单(税务账ID,发票日期,渠道ID,建表人,发票样式,发票编号,发票金额,门店,归档,价格审核,审核)
SELECT 进货发票单ID,发票日期,渠道ID,建表人,发票样式,发票编号,发票金额,门店,'False','False','False'
FROM INSERTED
UPDATE [SQL_HB_D001]..C5进货发票单
SET
创建日期 = i.创建日期
FROM [SQL_HB_D001]..C5进货发票单 B,A进货发票单 i
WHERE B.税务账ID = i.进货发票单ID
END
GOUSE SQL_HB_JXC
GO
CREATE TRIGGER Trig_A进货发票单_D001C5进货发票单_UPDATE
ON A进货发票单
AFTER UPDATE
ASIF ((SELECT 归档 FROM INSERTED) = 'True') AND ((SELECT 价格审核 FROM INSERTED) = 'True')
BEGIN
IF (NOT EXISTS (SELECT 1 FROM [SQL_HB_D001]..C5进货发票单 A,INSERTED i WHERE A.税务账ID = i.进货发票单ID))
BEGIN
INSERT INTO [SQL_HB_D001]..C5进货发票单(税务账ID,发票日期,渠道ID,建表人,发票样式,发票编号,发票金额,门店,归档,价格审核,审核)
SELECT 进货发票单ID,发票日期,渠道ID,建表人,发票样式,发票编号,发票金额,门店,'False','False','False'
FROM INSERTED
UPDATE [SQL_HB_D001]..C5进货发票单
SET
创建日期 = i.创建日期
FROM [SQL_HB_D001]..C5进货发票单 B,A进货发票单 i
WHERE B.税务账ID = i.进货发票单ID
ENDELSE
BEGIN
UPDATE [SQL_HB_D001]..C5进货发票单
SET
创建日期 = i.创建日期,
发票日期 = i.发票日期,
渠道ID = i.渠道ID,
建表人 = i.建表人,
发票样式 = i.发票样式,
发票编号 = i.发票编号,
发票金额 = i.发票金额,
门店 = i.门店
FROM [SQL_HB_D001]..C5进货发票单 B,INSERTED i
WHERE B.税务账ID = i.进货发票单ID
END
END
GO在“[SQL_HB_JXC]..A进货发票单”中执行INSERT命令时,发现“[SQL_HB_D001]..C5进货发票单”中生成了两行相同的记录行。
把第一段代码的触发器删掉,保留UPDATE的触发器。执行INSERT命令时会生成一行记录。
UPDATE的触发器怎么会在INSERT时被执行呢。
我错在哪呢?新手菜鸟问题,请多指教。

解决方案 »

  1.   

    触发器中带有insert into语句呀从inserted表中插入到[SQL_HB_D001]内
      

  2.   

    我现在不明白,以UPDATE开头的触发器USE SQL_HB_JXC
    GO
    CREATE TRIGGER Trig_A进货发票单_D001C5进货发票单_UPDATE
    ON A进货发票单
    AFTER UPDATE
    AS为什么在我执行INSERT命令时会被触发执行?
      

  3.   

    你的表应该还有存在INSERTE触发器
      

  4.   

    大家看他的update触发器,里面有从inserted这个虚拟表中读数据插入到[SQL_HB_D001]
      

  5.   

    Tony(htl258)说的对,确实有还有一个INSERTE触发器,是用来让“创建日期”= getdate()
    我现在将两个INSERTE触发器合在一起,变成如下代码:
    INSERTE触发器:USE SQL_HB_JXC
    GO
    CREATE TRIGGER Trig_A进货发票单_D001C5进货发票单_INSERT_自动添加日期
    ON A进货发票单
    AFTER INSERT
    AS
    UPDATE A进货发票单
    SET
    创建日期 = getdate()
    WHERE 进货发票单ID = (SELECT 进货发票单ID FROM INSERTED)IF ((SELECT 归档 FROM INSERTED) = 'True') AND ((SELECT 价格审核 FROM INSERTED) = 'True')
    BEGIN
    INSERT INTO [SQL_HB_D001]..C5进货发票单(税务账ID,发票日期,渠道ID,建表人,发票样式,发票编号,发票金额,门店,归档,价格审核,审核)
    SELECT 进货发票单ID,发票日期,渠道ID,建表人,发票样式,发票编号,发票金额,门店,'False','False','False'
    FROM INSERTEDUPDATE [SQL_HB_D001]..C5进货发票单
    SET
    创建日期 = i.创建日期
    FROM [SQL_HB_D001]..C5进货发票单 B,A进货发票单 i
    WHERE B.税务账ID = i.进货发票单ID
    END
    GO
    UPDATE触发器:USE SQL_HB_JXC
    GO
    CREATE TRIGGER Trig_A进货发票单_D001C5进货发票单_UPDATE
    ON A进货发票单
    AFTER UPDATE
    AS
    IF ((SELECT 归档 FROM INSERTED) = 'True') AND ((SELECT 价格审核 FROM INSERTED) = 'True') AND  (NOT EXISTS (SELECT 创建日期 FROM DELETED))
    BEGIN
    IF (NOT EXISTS (SELECT 1 FROM [SQL_HB_D001]..C5进货发票单 A,INSERTED i WHERE A.税务账ID = i.进货发票单ID))
    BEGIN
    INSERT INTO [SQL_HB_D001]..C5进货发票单(税务账ID,创建日期,发票日期,渠道ID,建表人,发票样式,发票编号,发票金额,门店,归档,价格审核,审核)
    SELECT 进货发票单ID,创建日期,发票日期,渠道ID,建表人,发票样式,发票编号,发票金额,门店,'False','False','False'
    FROM INSERTED
    UPDATE [SQL_HB_D001]..C5进货发票单
    SET
    创建日期 = i.创建日期
    FROM [SQL_HB_D001]..C5进货发票单 B,A进货发票单 i
    WHERE B.税务账ID = i.进货发票单ID
    ENDELSEBEGIN
    UPDATE [SQL_HB_D001]..C5进货发票单
    SET
    创建日期 = i.创建日期,
    发票日期 = i.发票日期,
    渠道ID = i.渠道ID,
    建表人 = i.建表人,
    发票样式 = i.发票样式,
    发票编号 = i.发票编号,
    发票金额 = i.发票金额,
    门店 = i.门店
    FROM [SQL_HB_D001]..C5进货发票单 B,INSERTED i
    WHERE B.税务账ID = i.进货发票单ID
    END
    END
    GO问题找到了,因为在INSERT触发器中有UPDATE命令,从而启动了UPDATE触发器。
    这样就在“[SQL_HB_D001]..C5进货发票单”中INSERT了两行一样的记录。我应该怎样修改代码呢?
      

  6.   

    你把Insert 触发器中的下面这句删除掉:
    UPDATE A进货发票单
    SET
    创建日期 = getdate()
    WHERE 进货发票单ID = (SELECT 进货发票单ID FROM INSERTED)
    ,然后给这个字段设置上默认值,getdate(),插入的语句不要写上这个字段即可。
      

  7.   

    若要在字段设置上默认值,此列必须为非空(not null)。但如果如此设置,在VB.net相应窗体中不填写此数据,VB.net就会提示这一列设置为非空(Not Null),必须填数据。
    我用的是VB.net2008,是用填加数据源的方式,可视化的制作了与数据库的关联。所以我才写了以下一段代码到INSERTE触发器中。UPDATE A进货发票单
    SET
    创建日期 = getdate()
    WHERE 进货发票单ID = (SELECT 进货发票单ID FROM INSERTED)
      

  8.   

    你数据库中这个字段是别的表的外键?不允许为空?
    我不懂VB.Net,但是我觉得VB.Net可以写Insert语句时不加上这个字段就可以了.至于界面也应该可以设置的.可能你还不是很清楚.
      

  9.   

    解决了。
    在INSERTE触发器中将INSERT INTO语句与UPDATE语句换一下顺序即可:USE SQL_HB_JXC
    GO
    CREATE TRIGGER Trig_A进货发票单_D001C5进货发票单_INSERT_自动添加日期
    ON A进货发票单
    AFTER INSERT
    ASBEGIN
    IF ((SELECT 归档 FROM INSERTED) = 'True') AND ((SELECT 价格审核 FROM INSERTED) = 'True')
    INSERT INTO [SQL_HB_D001]..C5进货发票单(税务账ID,发票日期,渠道ID,建表人,发票样式,发票编号,发票金额,门店,归档,价格审核,审核)
    SELECT 进货发票单ID,发票日期,渠道ID,建表人,发票样式,发票编号,发票金额,门店,'False','False','False'
    FROM INSERTED
    ENDBEGIN
    UPDATE A进货发票单
    SET
    创建日期 = getdate()
    WHERE 进货发票单ID = (SELECT 进货发票单ID FROM INSERTED)
    ENDBEGIN
    IF ((SELECT 归档 FROM INSERTED) = 'True') AND ((SELECT 价格审核 FROM INSERTED) = 'True')
    UPDATE [SQL_HB_D001]..C5进货发票单
    SET
    创建日期 = i.创建日期
    FROM [SQL_HB_D001]..C5进货发票单 B,A进货发票单 i
    WHERE B.税务账ID = i.进货发票单ID
    END
    GO