写了两个触发器,代码如下:
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时被执行呢。
我错在哪呢?新手菜鸟问题,请多指教。
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时被执行呢。
我错在哪呢?新手菜鸟问题,请多指教。
GO
CREATE TRIGGER Trig_A进货发票单_D001C5进货发票单_UPDATE
ON A进货发票单
AFTER UPDATE
AS为什么在我执行INSERT命令时会被触发执行?
我现在将两个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了两行一样的记录。我应该怎样修改代码呢?
UPDATE A进货发票单
SET
创建日期 = getdate()
WHERE 进货发票单ID = (SELECT 进货发票单ID FROM INSERTED)
,然后给这个字段设置上默认值,getdate(),插入的语句不要写上这个字段即可。
我用的是VB.net2008,是用填加数据源的方式,可视化的制作了与数据库的关联。所以我才写了以下一段代码到INSERTE触发器中。UPDATE A进货发票单
SET
创建日期 = getdate()
WHERE 进货发票单ID = (SELECT 进货发票单ID FROM INSERTED)
我不懂VB.Net,但是我觉得VB.Net可以写Insert语句时不加上这个字段就可以了.至于界面也应该可以设置的.可能你还不是很清楚.
在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