gar*_*rik 5 trigger sql-server-2008 error-handling
我在表(源)上有一个触发器,应将数据复制到其他数据库中的另一个(目标)。我正在尝试为数据实现自定义同步过程:我希望目标数据库(表)与源数据库(表)保持同步。我有 300 个表要同步。其中一些具有不同的物理数据结构。由于不同的数据架构和其他限制(实施时间、环境问题...),我无法使用 Sql Server 的标准方法(复制、DTS...)。我的目标是:此触发器不应影响源表中记录的插入、删除、更新。我试过这样的解决方案:
CREATE TRIGGER dbo.MyTrigger
...
AFTER INSERT
....
BEGIN TRY
--RAISERROR('Test error', 16, 2)
END TRY
BEGIN CATCH
-- nothing
END CATCH
Run Code Online (Sandbox Code Playgroud)
我已经插入RAISEERROR
来模拟错误。我希望,try/catch
抑制该错误并成功插入(删除或更新)记录。别。这是行不通的。我有错误:
触发器执行期间出现错误。批处理已中止,并且用户事务(如果有)已回滚。
是否有可能以这种方式实现我的解决方案。如何捕获并保持(抑制)触发器中的任何错误?
try/catch
如果它不起作用,在触发器中使用有什么意义?
该事务几乎注定要发生任何异常,并且必须回滚。
来自MSDN 上的“在 Transact-SQL 中使用 TRY...CATCH”
在 TRY…CATCH 构造中,事务可以进入一种状态,在该状态中事务保持打开但不能提交。事务不能执行任何会生成事务日志写入的操作,例如修改数据或尝试回滚到保存点。但是,在这种状态下,事务获取的锁被保持,连接也保持打开状态。在发出 ROLLBACK 语句或批处理结束并且数据库引擎自动回滚事务之前,事务的效果不会逆转。如果在事务进入不可提交状态时没有发送错误消息,当批处理完成时,将向客户端应用程序发送一条错误消息,指示检测到不可提交事务并回滚。
当发生错误时,事务在 TRY 块内进入不可提交状态,否则会结束事务。例如,来自数据定义语言 (DDL) 语句(例如 CREATE TABLE)的大多数错误,或当 SET XACT_ABORT 设置为 ON 时发生的大多数错误,会在 TRY 块外终止事务,但使事务在 TRY 块内不可提交.
这个例子说明了原因。XACT_STATE() 不注册隐含交易(例如,没有明确的 BEGIN TRAN)
CREATE TABLE TrgTest (gbn int NOT NULL);
GO
CREATE TRIGGER TRG_TrgTEst_I ON TrgTest AFTER INSERT
AS
BEGIN TRY
SELECT '1', @@TRANCOUNT, XACT_STATE();
RAISERROR('Test error', 16, 2);
END TRY
BEGIN CATCH
SELECT '2', @@TRANCOUNT, XACT_STATE();
END CATCH
GO
BEGIN TRANSACTION
INSERT TrgTest VALUES (1)
SELECT 'will not run'
GO
SELECT 'next batch'
GO
BEGIN TRY
BEGIN TRANSACTION
SELECT 'a', @@TRANCOUNT, XACT_STATE();
INSERT TrgTest VALUES (1)
SELECT 'b', @@TRANCOUNT, XACT_STATE();
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
SELECT 'c', @@TRANCOUNT, XACT_STATE();
END CATCH
GO
DROP TABLE TrgTest;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
24502 次 |
最近记录: |