我正在编写 SQL Server 2005 触发器。我想在触发器执行期间使用 INSERT 语句到我的日志表中进行一些日志记录。当执行过程中发生错误时,我想引发错误并取消导致触发器执行的操作,但不丢失日志记录。实现这一目标的最佳方法是什么?
现在我的触发器会记录除出现错误时的情况之外的所有内容 - 由于回滚。需要 RAISERROR 语句来通知调用程序有错误。
现在,我的错误处理代码如下所示:
if (@err = 1)
begin
INSERT INTO dbo.log(date, entry) SELECT getdate(), 'ERROR: ' + out from #output
RAISERROR (@msg, 16, 1)
rollback transaction
return
end
最佳答案
另一个可能的选择是使用表变量来捕获您想要存储在永久日志表中的信息。如果给出 ROLLBACK TRANSACTION 命令,则表变量不会回滚。示例代码如下...
--- Declare table variable
DECLARE @ErrorTable TABLE
( [DATE] smalldatetime,
[ENTRY] varchar(64) )
DECLARE @nErrorVar int
--- Open Transaction
BEGIN TRANSACTION
--- Pretend to cause an error and catch the error code
SET @nErrorVar = 1 --- @@ERROR
IF (@nErrorVar = 1)
BEGIN
--- Insert error info table variable
INSERT INTO @ErrorTable
( [Date], [Entry] )
SELECT
getdate(), 'Error Message Goes Here'
RAISERROR('Error Message Goes Here', 16, 1)
ROLLBACK TRANSACTION
--- Change this to actually insert into your permanent log table
SELECT *
FROM @ErrorTable
END
IF @@TRANCOUNT 0
PRINT 'Open Transactions Exist'
ELSE
PRINT 'No Open Transactions'
关于sql - 登录到 SQL Server 触发器中的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2809659/