【发布时间】:2011-03-17 17:23:13
【问题描述】:
也许有更好的方法来做到这一点。我想要的要点是让 SQL Server 向我提出 2 种类型的错误:更新表时来自触发器的警告和错误。如果 SQL 服务器返回警告,则触发器应提交但向用户显示警告(使用 .NET - 最好通过仅在严重性 > 10 时引发的 SQL 异常),如果是错误,则触发器应回滚并显示错误给用户(通过 SQL 异常)。我在这方面的尝试(不用说这是行不通的)是有一个这样的触发器:
ALTER TRIGGER [dbo].[TR_TRANSACTION_UPDATE]
ON [dbo].[tTRANSACTION]
FOR UPDATE
AS
BEGIN
...
BEGIN TRY
DECLARE @id INT ,@maxid INT
SELECT @id = 0 ,@maxid = MAX(transID) FROM INSERTED
WHILE @id < @maxid
BEGIN
SELECT @id = MIN([TransID]) FROM INSERTED WHERE [TransID] > @id
EXEC dbo.sp_CheckTransaction @TransID = @id
END
COMMIT TRANSACTION
END TRY
BEGIN CATCH
DECLARE @err_msg VARCHAR(MAX), @err_sev AS INT, @err_state AS INT
SELECT @err_msg = ERROR_MESSAGE(), @err_sev = ERROR_SEVERITY(), @err_state = ERROR_STATE()
IF @err_state <> 120 -- '120 is not a fatal error from STORED_PROC
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION
RAISERROR(@err_msg, @err_sev, @err_state)
END CATCH
END
此触发器不起作用,因为它认为事务不可提交。
另外,sp_CheckTransaction 可以引发 2 类错误:
RAISERROR(@msg, 15, 120) -- warning
or RAISERROR(@msg, 15, 121) -- error
我不能使用小于 15 的严重性的原因是因为我希望在 .NET 中显示警告(我可以根据状态和严重性来决定是警告还是错误)。 .NET SqlException 仅在严重性 > 10 时引发。
【问题讨论】:
标签: c# .net sql sql-server vb.net