我有以下觸發器,當它運行這會導致一個錯誤:sp_addlinkserver使用觸發
CREATE TRIGGER ...
ON ...
FOR INSERT, UPDATE
AS
IF UPDATE(STATUS)
BEGIN
DECLARE @newPrice VARCHAR(50)
DECLARE @FILENAME VARCHAR(50)
DECLARE @server VARCHAR(50)
DECLARE @provider VARCHAR(50)
DECLARE @datasrc VARCHAR(50)
DECLARE @location VARCHAR(50)
DECLARE @provstr VARCHAR(50)
DECLARE @catalog VARCHAR(50)
DECLARE @DBNAME VARCHAR(50)
SET @server=xx
SET @provider=xx
SET @datasrc=xx
SET @provstr='DRIVER={SQL Server};SERVER=xxxxxxxx;UID=xx;PWD=xx;'
SET @DBNAME='[xx]'
SET @newPrice = (SELECT STATUS FROM Inserted)
SET @FILENAME = (SELECT INPUT_XML_FILE_NAME FROM Inserted)
IF @newPrice = 'FAIL'
BEGIN
EXEC master.dbo.sp_addlinkedserver
@server, '', @provider, @datasrc, @provstr
EXEC master.dbo.sp_addlinkedsrvlogin @server, 'true'
INSERT INTO [@server].[@DBNAME].[dbo].[maildetails]
(
'to', 'cc', 'from', 'subject', 'body', 'status',
'Attachment', 'APPLICATION', 'ID', 'Timestamp', 'AttachmentName'
)
VALUES
(
'P23741', '', '', 'XMLFAILED', @FILENAME, '4',
'', '8', '', GETDATE(), ''
)
EXEC sp_dropserver @server
END
END
錯誤是:
消息15002,級別16,狀態1,過程sp_MSaddserver_internal,行28 過程'sys.sp_addlinkedserver'不能在事務中執行。 消息15002,級別16,狀態1,過程sp_addlinkedsrvlogin,第17行 過程'sys.sp_addlinkedsrvlogin'不能在事務中執行。 消息15002,級別16,狀態1,過程sp_dropserver,行12 過程'sys.sp_dropserver'不能在事務中執行。
如何防止發生此錯誤?
永久鏈接服務器是服務器級別的對象。對於我們這些與其他開發團隊共享服務器的人來說,這是與那些可以避免的開發團隊的又一個協調點。如果您使用自動構建工具(如NAnt)協調跨環境的DDL更改部署,則需要儘可能在數據庫級別或更低級別的內容。 – alyssackwan 2010-03-01 20:03:32
@entaroadun:另一方面是'OPENROWSET'既需要源服務器的特殊權限,又需要保存憑據到目的地。這對於開發來說可能不是問題,但許多團隊可能不希望在生產中使用它。 – Aaronaught 2010-03-01 20:10:19