SqlPackage не принимает полное имя таблицы в синхронизирующем триггере
Я использую SymmetricDS версии 3.9.15 в Azure SQL для баз данных master и slave. Я могу правильно настроить инструмент для синхронизации баз данных, но при публикации проекта базы данных команда SqlPackage выдает ошибку из-за полного имени (включая имя каталога и имя схемы) таблицы и функции в следующем триггере.
USE [STAGING_PROD_Copy]
GO
/****** Object: Trigger [dbo].[SYM_ON_D_FOR_TRGGRLL_1_PRMRYSTGNG_PRDS] Script Date: 08-11-2018 21:17:09 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create trigger [dbo].[SYM_ON_D_FOR_TRGGRLL_1_PRMRYSTGNG_PRDS] on [STAGING_PROD_Copy].[dbo].[__RefactorLog] with execute as caller after delete as
begin
declare @NCT int
set @NCT = @@OPTIONS & 512
set nocount on
declare @TransactionId varchar(1000)
if (@@TRANCOUNT > 0) begin
select @TransactionId = convert(VARCHAR(1000),transaction_id) from sys.dm_exec_requests where session_id=@@SPID and open_transaction_count > 0
end
if (1=1) begin
insert into "STAGING_PROD_Copy"."dbo".sym_data (table_name, event_type, trigger_hist_id, pk_data, old_data, channel_id, transaction_id, source_node_id, external_data, create_time)
select '__RefactorLog','D', 100,
case when deleted."OperationKey" is null then '' else '"' + replace(replace(convert(varchar(36),deleted."OperationKey") ,'\','\\'),'"','\"') + '"' end,
case when deleted."OperationKey" is null then '' else '"' + replace(replace(convert(varchar(36),deleted."OperationKey") ,'\','\\'),'"','\"') + '"' end, 'matter',
@TransactionId, "STAGING_PROD_Copy".dbo.sym_node_disabled(), null, current_timestamp
from deleted where 1=1
end
if (@NCT = 0) set nocount off
end
---- go
GO
Две ссылки, которые вызывают проблему, заключаются в следующем.
"STAGING_PROD_Copy". "DBO".sym_data
"STAGING_PROD_Copy".dbo.sym_node_disabled
Как указать исходную и целевую схему / каталог таким образом, чтобы он не использовался при установке триггеров синхронизации.
Я использую следующую таблицу sym_router & sym_trigger.
insert into sym_router
(router_id,source_node_group_id,target_node_group_id,target_catalog_name,target_schema_name,target_table_name,USE_SOURCE_CATALOG_SCHEMA,router_type,create_time,last_update_time)
values('primary_2_secondary-staging_prod-us', 'primary-staging_prod-us', 'secondary-staging_prod-us', null, null, null, 0,'default',GetDate(), GetDate());
insert into sym_router
(router_id,source_node_group_id,target_node_group_id,target_catalog_name,target_schema_name,target_table_name,USE_SOURCE_CATALOG_SCHEMA,router_type,create_time,last_update_time)
values('secondary_2_primary-staging_prod-us', 'secondary-staging_prod-us', 'primary-staging_prod-us', null, null, null, 0,'default', GetDate(), GetDate());
insert into sym_trigger
(trigger_id,source_catalog_name,source_schema_name, source_table_name, channel_id, sync_on_insert, sync_on_update, sync_on_delete, last_update_time,create_time, sync_on_incoming_batch)
values('TriggerAll_1', null, null, '__RefactorLog', 'matter', 1 , 1, 1, GetDate(), GetDate(), 1);
После обращения в службу поддержки Microsoft я получил сообщение о том, что запросы к нескольким базам данных не поддерживаются в Azure SQL. Но в базе данных есть 1000 автоматически сгенерированных триггеров синхронизации с полностью определенными именами (включая каталог и схему) таблиц и функций, и ручной триггер изменения невозможен.
Даже экспорт базы данных с таким триггером вызывает ошибку в SSMS.
С уважением
Раджат Агравал
2 ответа
База данных SQL Azure не только не поддерживает перекрестные запросы к базе данных, но и не поддерживает имена из трех или четырех частей, когда вы ссылаетесь на таблицу / объект.
Рассматривали ли вы использование Azure SQL Data Sync для синхронизации ваших баз данных? У вас не будет таких проблем с синхронизацией данных Azure SQL, и она полностью поддерживается Microsoft/Azure.
Если вы хотите экспортировать эту базу данных, вам придется написать сценарии для этих триггеров, удалить их, экспортировать базу данных, импортировать ее на новый сервер и запустить сценарий, чтобы воссоздать все триггеры.
Вы можете отключить имя каталога в триггерах, используя следующую опцию в SymmetricDS.
mssql.include.catalog.in.triggers = ложь
(Включает имя каталога / базы данных в сгенерированных триггерах (catalog.schema.table). Может потребоваться отключить для поддержки процессов резервного копирования, таких как создание файла bacpac)
Вы можете прочитать больше об этой опции здесь.
https://www.symmetricds.org/doc/3.9/html/user-guide.html
С уважением Раджат Агравал