У меня есть следующий триггер, который вызывает ошибку при запуске: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
Ошибка:
Msg 15002, уровень 16, состояние 1, процедура sp_MSaddserver_internal, линия 28 Процедура 'sys.sp_addlinkedserver' не может быть выполнена в транзакции. Msg 15002, уровень 16, состояние 1, процедура sp_addlinkedsrvlogin, строка 17 Процедура 'sys.sp_addlinkedsrvlogin' не может быть выполнена в транзакции. Msg 15002, уровень 16, состояние 1, процедура sp_dropserver, строка 12 Процедура 'sys.sp_dropserver' не может быть выполнена в транзакции.
Как предотвратить эту ошибку?
Постоянно связанные серверы являются объектами уровня сервера. Для тех из нас, кто использует серверы с другими командами разработчиков, это еще одна координационная точка с этими командами разработчиков, которых можно избежать. Если вы используете автоматические инструменты сборки, например NAnt, для координации развертывания изменений DDL в среде, вы хотите как можно больше материала на уровне базы данных или ниже. – alyssackwan
@entaroadun: обратная сторона заключается в том, что 'OPENROWSET' требует как специальных разрешений на исходном сервере, так и сохраненных учетных данных для адресата. Это, вероятно, не проблема для разработки, но многие команды могут не захотеть этого в производстве. – Aaronaught