-- 在发布服务器上,针对发布数据库执行此脚本 USE [MyDatabase]; -- 替换为你的发布数据库名 GO -- 声明变量 DECLARE @PublicationName NVARCHAR(128) = N'MyLargePublication'; -- 替换为你已经创建的发布名称 DECLARE @SchemaName NVARCHAR(128) = N'dbo'; -- 替换为你要发布的表的schema -- 生成 sp_addarticle 脚本(已包含 @force_invalidate_snapshot 参数) SELECT 'EXEC sp_addarticle @publication = N''' + @PublicationName + ''', @article = N''' + t.name + ''', @source_owner = N''' + @SchemaName + ''', @source_object = N''' + t.name + ''', @type = N''logbased'', -- 对于事务发布,类型是 ''logbased'' @description = N'''', @creation_script = N'''', @pre_creation_cmd = N''drop'', -- 如果订阅端已存在表,则先删除 @schema_option = 0x00000000000000F3, -- 常用的schema选项组合 @identityrangemanagementoption = N''manual'', -- 身份范围管理 @destination_table = N''' + t.name + ''', @destination_owner = N''' + @SchemaName + ''', @force_invalidate_snapshot = 1; -- 强制使现有快照无效(关键参数)' AS AddArticleScript FROM sys.tables t JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE s.name = @SchemaName AND t.name LIKE N't_%'; -- 替换为你的筛选条件
下面脚本是查询出所有带主键的表, 在同步中, 这个是比较重要的
PS: 可以通过 INNER JOIN sys.key_constraints 实现,筛选条件为 type = 'PK'(主键的类型标识)。
-- 在发布服务器上,针对发布数据库执行此脚本 USE [MyDatabase]; -- 替换为你的发布数据库名 GO -- 声明变量 DECLARE @PublicationName NVARCHAR(128) = N'MyLargePublication'; -- 替换为你已经创建的发布名称 DECLARE @SchemaName NVARCHAR(128) = N'dbo'; -- 替换为你要发布的表的schema -- 生成 sp_addarticle 脚本(已包含 @force_invalidate_snapshot 参数) SELECT 'EXEC sp_addarticle @publication = N''' + @PublicationName + ''', @article = N''' + t.name + ''', @source_owner = N''' + @SchemaName + ''', @source_object = N''' + t.name + ''', @type = N''logbased'', -- 对于事务发布,类型是 ''logbased'' @description = N'''', @creation_script = N'''', @pre_creation_cmd = N''drop'', -- 如果订阅端已存在表,则先删除 @schema_option = 0x00000000000000F3, -- 常用的schema选项组合 @identityrangemanagementoption = N''manual'', -- 身份范围管理 @destination_table = N''' + t.name + ''', @destination_owner = N''' + @SchemaName + ''', @force_invalidate_snapshot = 1; -- 强制使现有快照无效(关键参数)' AS AddArticleScript FROM sys.tables t JOIN sys.schemas s ON t.schema_id = s.schema_id -- 新增条件:只筛选带主键的表 JOIN sys.key_constraints kc ON t.object_id = kc.parent_object_id AND kc.type = 'PK' WHERE s.name = @SchemaName AND t.name LIKE N't_%'; -- 替换为你的筛选条件
PS: 如果你想通过 SQL 语句查询某个数据库中的所有 schema,或者某个表所属的 schema,可以执行以下脚本:
在 SQL Server 中,dbo 是默认架构。如果你在创建表时没有指定 schema,那么该表会自动归属到 dbo schema 下。
-- 1. 查询当前数据库中所有的 schema SELECT name AS schema_name FROM sys.schemas ORDER BY name; -- 2. 查询某个表所属的 schema(示例:查询表名为 t_user 的表的 schema) SELECT t.name AS table_name, s.name AS schema_name FROM sys.tables t JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE t.name = 't_user'; -- 替换为你的表名
通过以上五个步骤,你就成功地利用 T-SQL 脚本批量创建了发布项目。这种方法的优势在于:
现在,你的发布 MyLargePublication 已经包含了所有你需要的表,并且快照也已更新,接下来就可以正常创建订阅了。
本文为宁若水!原创文章,转载无需和我联系,但请注明来自[若水]博客 www.lalaya.net
