sql - SqlPackage 不接受同步触发器中表的完全限定名称
问题描述
我在 Azure SQL 上为主数据库和从数据库使用 SymmetricDS 版本 3.9.15。我能够正确配置该工具以同步数据库,但是在发布数据库项目时,由于以下触发器中表和函数的完全限定名称(包括目录名称和模式名称),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 出错。
问候
拉贾特·阿格拉瓦尔
解决方案
您可以使用 SymmetricDS 中的以下选项禁用触发器中的目录名称。
mssql.include.catalog.in.triggers=false
(包括生成的触发器(catalog.schema.table)中的目录/数据库名称。可能需要关闭以支持备份过程,例如创建 bacpac 文件)
您可以在此处阅读有关此选项的更多信息。
https://www.symmetricds.org/doc/3.9/html/user-guide.html#_runtime_parameters
问候拉贾特·阿格拉瓦尔
推荐阅读
- java - JSSE 和 JCE 有什么区别?
- java - 在预编译项目上使用 Maven 运行测试
- c++ - 在 C++ 中使用#include 宏来实现 mixin 模式好吗
- c# - “int”不包含“Select”的定义,并且找不到接受“int”类型的第一个参数的扩展方法“Select”
- amazon-web-services - Cloudformation Yaml 内部函数完整函数名称
- java - java Rest API中的登录身份验证获取不支持的媒体类型
- css - 为什么div周围有空格
- javascript - 禁止 setInterval 进行 REST 调用
- spring - 如何使用@SpringBootApplication 获取类注解
- sql-server - 在 SQL Server 中使用 CTE 生成自定义序列号