위한 시도 - 캐치에도 불구하고 데이터를 로컬 커밋에 실패 트리거, 나는 그것이 MYLINKEDSERVER
에 TestDatabase
에 TestTable
의 내용을 삭제하고 처음부터 모든 것을 다시 삽입합니다. 이렇게하려면 MyTable
에서 트리거를 사용합니다. 이 방법이 비효율적이지만 레코드 수가 10 개 미만이라는 것을 알고 있습니다.SQL 서버 2012 - 내가 <code>MyDatabase</code>에 <code>MyTable</code>을 변경 한 경우 sp_testlinkedserver
링크 된 서버가 다운 된 경우에도 로컬에서 변경 사항을 MyTable
으로 커밋하고 linkedserver가 업데이트 되십시오. 연결된 서버를 사용할 수 없을 때 커밋 할 로컬 트랜잭션을 가져 오지 못했습니다 ... XACT_ABORT
함께 망쳐 봤지만 다른 오류가 발생합니다.
내가 뭘 잘못하고 있니?
CREATE TRIGGER trig_updatelinkedserver ON MyDatabase.dbo.MyTable
FOR INSERT, UPDATE, DELETE
AS
BEGIN
DECLARE @linked_server SYSNAME = 'MYLINKEDSERVER'
, @tablename SYSNAME --name of the table calling the trigger so we can send error details in alert eamil
SELECT @tablename = OBJECT_NAME(parent_object_id)
FROM sys.objects
WHERE sys.objects.name = OBJECT_NAME(@@PROCID)
BEGIN TRY
--If linkedserver fails to connect, we do not want the remaining code in the block to run
--but we do want the original transaction that triggered this to complete.
EXEC sp_testlinkedserver @servername = @linked_server
DELETE FROM MYLINKEDSERVER.TestDatabase.dbo.TestTable
INSERT INTO MYLINKEDSERVER.TestDatabase.dbo.TestTable
SELECT *
FROM MyDatabase.dbo.MyTable
END TRY
BEGIN CATCH
DECLARE @subj VARCHAR(1000) = 'TRIGGER FAILURE: ' + @tablename + ': Could not locate linkedserver ' + @linked_server
EXEC msdb.dbo.sp_send_dbmail
@recipients = '[email protected]'
, @subject = @subj
, @body = ''
, @body_format = 'HTML'
, @profile_name = 'MyEmailProfile'
END CATCH
END
https://docs.microsoft.com/en-us/sql/t-sql/statements/set-xact-abort-transact-sql을 확인하고 SET XACT_ABORT를 OFF로 설정하십시오. – Naidu