【发布时间】:2018-11-16 00:41:46
【问题描述】:
我正在尝试创建一个触发器,在创建之前我尝试将其测试为执行内部代码。提取代码本身可以工作,但触发器不起作用。代码如下:
USE [PMIDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[BRK_ÇEKME_KAP_INSERTED]
ON [dbo].[ATMATERIALTRANS]
FOR INSERT
AS BEGIN
DECLARE @RDATE DATE
DECLARE @MAKİNE VARCHAR(10)
DECLARE @OKUTULAN_BARKOD VARCHAR(20)
DECLARE @MIKTAR INT
DECLARE @WC_ID INT
SELECT * FROM ATMATERIALTRANS
DECLARE CUR CURSOR
FOR
SELECT TDATE, WORKCENTERS.CODE, ATMATERIALS.BARCODE, ATMATERIALS.AMOUNT, WC_ID FROM INSERTED T1
LEFT JOIN ATCOMPOSITIONS ON ATCOMPOSITIONS.ID=T1.COMPID
LEFT JOIN WORKCENTERS ON WORKCENTERS.ID=T1.WC_ID
LEFT JOIN ATMATERIALS ON ATMATERIALS.ID=ATCOMPOSITIONS.MATERIALID
WHERE T1.COMPID IS NOT NULL AND WORKCENTERS.CODE LIKE 'DD%'
OPEN CUR
FETCH NEXT FROM CUR INTO @RDATE, @MAKİNE, @OKUTULAN_BARKOD,@MIKTAR, @WC_ID
WHILE @@FETCH_STATUS=0 BEGIN
INSERT INTO BURAK..ÇEKME_KAP (TARİH,MAKİNE,OKUTULAN_BARKOD,MİKTAR, HAMMADDE_GCKOD)
VALUES
(@RDATE,
@MAKİNE,
@OKUTULAN_BARKOD,
@MIKTAR, 'G')
UPDATE BURAK..MALKABUL_BARKOD SET BURAK..MALKABUL_BARKOD.KULLANILDI =1 WHERE BURAK..MALKABUL_BARKOD.BARKOD=@OKUTULAN_BARKOD
FETCH NEXT FROM CUR INTO @RDATE, @MAKİNE, @OKUTULAN_BARKOD,@MIKTAR, @WC_ID
END
CLOSE CUR
DEALLOCATE CUR
END
【问题讨论】:
-
您使用的是哪个数据库?
-
1.光标+触发器是非常反模式的。 2. 你真的不需要可以被常规插入和更新替换的游标, 3. 你真的需要在触发器中使用它吗? 4. 这种味道作为一个错位的业务规则,是不是更适合业务层?
-
您如何确定它“不工作”?
-
1.我同意你的观点 2. 我同意你的观点,将尝试不使用 fetch.. 3. 我真的需要触发器,插入时间太重要了,它应该在插入原始表的同时在其他一些 undependend 之前完成查询已完成。
标签: sql-server tsql sql-insert database-trigger