SQL Server Replication 中关于视图的点滴

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

    在服务器A数据库TEST新建了一个本地发布(Local Publications)RPL_GES_MIS_TEST,在服务器B数据库RPL_TEST上创建了一个本地订阅(Local Subscriptions),它订阅了了这个发布RPL_GES_MIS_TEST.如下截图所示,本地发布只有DB_OBJECTS 、Location两个表

clipboard

假设现在有一个需求,我们需要同步一个视图V_DB_OBJECTS(当然实际情况应该比这个复杂,有可能视图是多个表关联,测试场景我们先简化一下),视图代码如下

CREATE VIEW V_DB_OBJECTS
AS
 SELECT * FROM DB_OBJECTS WHERE type !='S';

我们右键单击RPL_GES_MIS_TEST的属性,在Articles里面添加了该视图

clipboard[1]

此时我们使用sp_helpsubscription查看订阅的特定的发布、项目、订阅服务器或订阅集关联的订阅信息。就会发现视图V_DB_OJBECTS的subscription status为1,表示订阅服务器正在请求数据,但尚未同步。

clipboard[2]

此时你右键单击对应的本地发布RPL_GES_MIS_TEST,选择“View Snapshopt Agent Status",如下所示,你会看到它提示快照生成了2个项目,意味着其实这个视图不在快照里面。

clipboard[3]

clipboard[4]

此时,你点击开始,重新生成快照,你会发现下面信息。快照重新初始化了3个项目。

clipboard[5]

那么我们有没有办法,在发布订阅里面,只同步一个新的视图,而不用初始化整个快照吗? 答案是有,其实方法很简单,具体可以参考我这篇文章SQL SERVER Transactional Replication中添加新表如何不初始化整个快照 。此处不做展开分析

CREATE VIEW V_DB_OBJECTS_2
AS
 SELECT * FROM DB_OBJECTS WHERE type !='S'
 
 
 
USE TEST;
GO
 
EXEC sp_changepublication
@publication = 'RPL_GES_MIS_TEST',
@property = 'allow_anonymous' ,
@value = 'false'
GO
EXEC sp_changepublication
@publication = 'RPL_GES_MIS_TEST',
@property = 'immediate_sync' ,
@value = 'false'
GO 

执行上面脚本后,我们在发布里面的项目(Articles)里面添加视图V_DB_OBJECTS_2,然后我们在View Snapshot Agent Status窗口,单击“Start"按钮,你会发现快照只生成了这个视图。如下所示

clipboard[6]

另外,可能有同学有疑问,如果我的视图已经通过Replication同步了,那么我修改视图有没有影响?会不会也同步过去呢? 如下所示,修改V_DB_OBJECTS_2

clipboard[7]

你会发现修改过后的视图很快就同步到订阅服务的数据库上,但是要注意,如果选项”Replicate schema changes"为False,那么此时对视图的修改是不会同步过去

clipboard[8]

另外需要注意:对视图的修改仅仅限制在视图的引用对象也在复制 (Replication)当中,如果引用了一个不在复制(Replication)的项目,那么此时就会有问题了。其实不光是修改已经同步的视图,其实 同步一张新的视图,如果视图引用的项目(对象)不在发布订阅(Replication)当中也会有问题,它会报如下错误:

Unable to replicate a view or function because the referenced objects or columns are not present on the Subscriber.

clipboard[9]

还有一种情况就是视图所引用的对象都在发布订阅当中,但是视图跨越了多个数据库,那么是否也有问题呢?

如下所示,视图引用了TEST数据库的表DB_OBJECTS和TTT数据库的表mmFrameModel, 而且TTT数据库的表mmFrameModel也同步到了订阅数据库RPL_DB_TEST当中,但是此时同步依然会有问题

CREATE VIEW V_TEST2
AS
 SELECT name  AS NAME  FROM DB_OBJECTS
 UNION ALL
 SELECT Machine_Model AS NAME FROM TTT.dbO.mmFrameModel;

有一个替换方案就是不同步视图,而是在同步了视图引用的对象后,在订阅的数据库上也创建同样逻辑的视图。只是这个替换方案有点麻烦的是,在修改了发布数据库上的视图后,一定要记得也同时手动修改订阅数据库的视图

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
2月前
|
SQL 存储 数据库
实验4:SQL视图操作与技巧
在SQL数据库管理中,视图(View)是一种虚拟表,它基于SQL查询的结果集创建,并不存储实际数据,而是存储查询定义
|
2月前
|
SQL 存储 数据库
实验4:SQL视图操作技巧与方法
在数据库管理系统中,视图(View)是一种虚拟表,它基于SQL查询的结果集创建,并不实际存储数据
|
2月前
|
存储 SQL 安全
|
2月前
|
SQL 数据库
SQL使用视图的优缺点
SQL使用视图的优缺点
68 0
|
2月前
|
存储 SQL 数据库
使用SQL创建视图和存储过程
使用SQL创建视图和存储过程
23 0
|
3月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
4月前
|
存储 SQL 安全
【数据库高手的秘密武器:深度解析SQL视图与存储过程的魅力——封装复杂逻辑,实现代码高复用性的终极指南】
【8月更文挑战第31天】本文通过具体代码示例介绍 SQL 视图与存储过程的创建及应用优势。视图作为虚拟表,可简化复杂查询并提升代码可维护性;存储过程则预编译 SQL 语句,支持复杂逻辑与事务处理,增强代码复用性和安全性。通过创建视图 `high_earners` 和存储过程 `get_employee_details` 及 `update_salary` 的实例,展示了二者在实际项目中的强大功能。
45 1
|
4月前
|
SQL 存储 数据库
创建SQL Server视图
【8月更文挑战第19天】创建SQL Server视图
52 1
|
4月前
|
JSON 数据格式 Java
化繁为简的魔法:Struts 2 与 JSON 联手打造超流畅数据交换体验,让应用飞起来!
【8月更文挑战第31天】在现代 Web 开发中,JSON 成为数据交换的主流格式,以其轻量、易读和易解析的特点受到青睐。Struts 2 内置对 JSON 的支持,结合 Jackson 库可便捷实现数据传输。本文通过具体示例展示了如何在 Struts 2 中进行 JSON 数据的序列化与反序列化,并结合 AJAX 技术提升 Web 应用的响应速度和用户体验。
131 0
|
4月前
|
SQL 存储 安全
SQL视图实验:创建、查询与管理技巧
在数据库管理系统中,视图(View)是一个虚拟表,其内容由查询定义