下面脚本是查询出所有带主键的表, 在同步中, 这个是比较重要的
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'; -- 替换为你的表名
-- 1. 添加文章 EXEC sp_addarticle @publication = N'K3-2026-PUB', @article = N'T_ECC_AFTERSALEORDERENTRY_C', @source_owner = N'dbo', @source_object = N'T_ECC_AFTERSALEORDERENTRY_C', @type = N'logbased', @pre_creation_cmd = N'drop', @schema_option = 0x000000000803509F, -- 更安全的选项 @identityrangemanagementoption = N'manual', @destination_table = N'T_ECC_AFTERSALEORDERENTRY_C', @destination_owner = N'dbo', @force_invalidate_snapshot = 1; -- 2. 刷新所有订阅(关键!) EXEC sp_refreshsubscriptions @publication = N'K3-2026-PUB'; -- 3. 重新初始化每个订阅(可选但推荐) EXEC sp_reinitsubscription @publication = N'K3-2026-PUB', -- 发布名称 @subscriber = N'YourSubscriber', -- 替换为实际订阅服务器名称 @destination_db = N'YourDB', -- 发布数据库名 @article = N'all'; -- 或指定具体article -- 4. 手动启动快照代理(重新生成快照) EXEC sp_startpublication_snapshot @publication = N'K3-2026-PUB'; -- 5. (可选) 查看当前已经发布的表 USE AIS20251214222026; -- 替换为你的实际发布数据库名 GO SELECT p.name AS publication_name, a.name AS article_name, s.name AS source_schema, o.name AS source_table, a.dest_table AS destination_table FROM dbo.syspublications p INNER JOIN dbo.sysarticles a ON p.pubid = a.pubid INNER JOIN sys.objects o ON a.objid = o.object_id INNER JOIN sys.schemas s ON o.schema_id = s.schema_id ORDER BY p.name, s.name, o.name;
总体来说, 建立SQL的发布还是比较简单, 主要还是权限问题比较多.
对于请求订阅, 一定要共享快照目录, 主从两台服务器, 建立同样的用户名和密码, 用来读取快照文件夹和启动代理服务, 这样比较稳定, 快照文件夹一定以 "\\服务器名\文件夹名" 这样的方式.
通过以上五个步骤,你就成功地利用 T-SQL 脚本批量创建了发布项目。这种方法的优势在于:
现在,你的发布 MyLargePublication 已经包含了所有你需要的表,并且快照也已更新,接下来就可以正常创建订阅了。
本文为宁若水!原创文章,转载无需和我联系,但请注明来自[若水]博客 www.lalaya.net
