我在供应商的软件(当然是在我们的机器上)的桌子上放置一个触发器,它将为我们的银行创建一个以特定格式写入的支票记录(因为我们所处的业务类型,我们需要关于为欺诈管理而写的支票的最新报告)。我已经编写了一个强大的应用程序来完成这项工作,但我们对主要软件的任何影响都非常担心。例如,如果触发器中出现任何错误,整个应用程序插入过程(包含多个文件)就会向南移动,我们无法承担使用副应用程序搞乱生产的问题。
因此,我们将使用最少的数据编写此检查跟踪记录,并以从应用程序中删除的方式处理它。
问题:有没有办法确保即使我们基本上空白的记录无法写出我们供应商的软件中的INSERT仍然无论如何都会继续?
答案 0 :(得分:1)
我总是发现最稳定的操作是基于:
INSERT INTO MyTable
SELECT SomeValue
FROM Inserted
WHERE [logic here]
如果逻辑失败,它只会插入零行。
答案 1 :(得分:1)
是 - 请勿使用触发器。
而不是说:
CREATE TRIGGER CheckSpy ON checks
FOR AFTER INSERT AS
INSERT INTO dbo.Spy(CheckID)
SELECT CheckID
FROM INSERTED
WHERE type="Fraud"
您可以编写一个存储过程,在插入的记录写完后将其拉出来。
INSERT INTO dbo.Spy(CheckID, ...)
SELECT C.CheckID, ...
FROM dbo.CheckID as I
RIGHT OUTER JOIN dbo.Checks as C
ON I.CheckID = C.CheckID
WHERE I.checkID IS NULL
AND I.Type = 'Fraud'
答案 2 :(得分:0)
您需要创建一个Instead of Insert Trigger
,它会在插入之前验证所有数据。检查数据验证并且一旦满意就执行插入,否则如果失败则验证检查只返回用户友好的错误消息,告诉最终用户如何解决问题并再次尝试。
毕竟你不希望你的顾客只是因为你的触发器不喜欢而离开。
CREATE TRIGGER tr_Trigger_Name
ON Table_Name
INSTEAD OF INSERT
AS
BEGIN
BEGIN TRY
/*DO your data validation checks here*/
IF (/*check No 1*/)
BEGIN
RAISERROR('Send this message to user to guide what to do', 16, 1)
END
IF (/*check No 2*/)
BEGIN
RAISERROR('Send this message to user to guide what to do', 16, 1)
END
/*Once Validation is done and you are happy to continue with the transaction*/
BEGIN TRANSACTION
INSERT /* Insert data what ever you want*/
COMMIT TRANSACTION
END TRY
BEGIN CATCH
/*If something has gone wrong During Validation of Data Insert*/
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION
/*DO other stuff here in case of an error or validation faliure */
END CATCH
END