Синхронизация данных SQL Azure невозможна, если установлен триггер
Я пытаюсь использовать SQL Azure Data Sync для синхронизации между SQL-Azure-DB и локальным SQL-Server 2008R2.
Я должен синхронизировать только одну таблицу с теперь только 90 строк. Таблица на стороне Azure имеет набор триггеров, но таблица на моем локальном sql-сервере не имеет этого триггера (потому что, кроме общей таблицы, две базы данных не имеют ничего общего).
Когда я пытаюсь синхронизировать это терпит неудачу с этой ошибкой:
Sync failed with the exception "GetStatus failed with exception:
Sync worker failed, checked by GetStatus method.
Failure details:
An unexpected error occurred when applying batch file C:\Resources\directory\61e9d741c80a47b4ae195f835e62fcda.NTierSyncServiceWorkerRole.LS1\DSS_syncjobmxd24sznwfq5idekfaopaery\a0e8b11a-a08c-4081-b929-e3f80b70f045.batch.
See the inner exception for more details.
Inner exception:
Failed to execute the command 'BulkInsertCommand' for table 'dbo.tblUser';
the transaction was rolled back. Ensure that the command syntax is correct.
Inner exception:
SqlException Error Code: -2146232060 - SqlError Number:512,
Message: Subquery returned more than 1 value.
This is not permitted when the subquery follows =, !=, <, <= , >, >=
or when the subquery is used as an expression.
SqlError Number:3621,
Message: The statement has been terminated.
For more information, provide tracing id ‘bb8e3787-27c1-4b7e-9a26-6db2ff6724d3’ to customer support.
Когда я отключаю свой триггер, синхронизация работает!
Мой триггер:
CREATE TRIGGER [dbo].[UpdateUsersTable]
ON [dbo].[tblUser]
AFTER INSERT AS BEGIN SET NOCOUNT ON;
INSERT INTO [dbo].[Users] ([userID], [PartnerOrganizationId])
VALUES ((select [userID] from inserted), (select [country] from inserted))
END
В качестве подхода я подумал, что может быть потому, что мой триггер и синхронизирующий триггер запускаются в неправильном порядке, поэтому я попытался:
exec sp_settriggerorder @triggername = 'tblUser_dss_insert_trigger',
@order = 'first',
@stmttype = 'insert',
@namespace = null
exec sp_settriggerorder @triggername = 'UpdateUsersTable',
@order = 'last',
@stmttype = 'insert',
@namespace = null
go
Но это ничего не изменило. Все та же ошибка.
Есть ли у меня шанс синхронизировать эту таблицу с моим триггером?
1 ответ
В вашем триггере вы используете INSERT, который вызывает эту проблему.
Пожалуйста, создайте отдельные триггеры для INSERT, UPDATE и DELETE. Системе нужно сравнить количество строк между вставленной и удаленной таблицами, чтобы определить, какое действие вызывает триггер. Наличие отдельных триггеров для INSERT/DELETE должно решить эту проблему.
Подобное обсуждение показывает точно такую же проблему здесь
Больше информации
В вашем триггере есть ошибка, и он не будет работать при любой многострочной вставке. Это должно быть что-то вроде:
CREATE TRIGGER [dbo].[UpdateUsersTable]
ON [dbo].[tblUser]
AFTER INSERT AS BEGIN SET NOCOUNT ON;
INSERT INTO [dbo].[Users] ([userID], [PartnerOrganizationId])
select [userID], [country] from inserted
END