SQL Server 视图套视图,隐患毒毒毒

houning · 2021年12月30日 · 最后由 xinggang 回复于 2021年12月31日 · 208 次阅读

为了开发便利,现阶段大家用了 N 多视图套视图的复杂套娃技术。虽然比较炫酷,但隐患风险也比较多。下面结合最近的实际案例,给大家提醒下,注意自家后院是否会起火。

例如,在遥远的 [链接服务器] 上的 [XX 数据库] 建立了 1 个 AAA(视图);然后在 10.200.0.92 上也建立了 1 个 AAA(视图),视图内容为 “select * from [链接服务器].[XX 数据库].AAA(视图)”。如果遥远的 [链接服务器] 上的 AAA(视图) 中添加了新字段时,10.200.0.92 上的 AAA(视图) 的数据结构不会同步更新;即在 [链接服务器] 上的 AAA(视图) 的字段列表的开始位置增加了 ZD1、ZD2,整体的字段列表由 10 个字段扩充为 12 个字段,如在 10.200.0.92 上执行 “select * from [链接服务器].[XX 数据库].AAA(视图)” 时,仍然只获取到未扩充前的 10 个字段,而且这 10 个字段的第一个字段的值变成了新增字段 ZD1 的字段值,第二个字段的值变成了新增字段 ZD2 的字段值,第三个字段的值变成了 12 个字段列表中第 3 个字段的值(即原来的 10 个字段列表中的第一个字段的值),以此类推,未扩充前的 10 个字段中的最后一个字段的值变成了 12 个字段列表中第 10 个字段的值(即原来的 10 个字段列表中的第 8 个字段的值)。

以上具体情形请脑补。

一旦发生上述问题,有极大可能会造成我们的系统发生莫名其妙的错误,且问题隐藏极深,不易排查。

不管 10.200.0.92 上的视图写成 “select * from .......” 还是 “select 字段名 1, 字段名 2,字段名 3 ... from .......”,结果都是一样的,无法规避上述问题。

现阶段,建议大家给视图增加字段时,将新字段添加到字段列表的最后,能够避免一部分问题,但也治标不治本,不能完全解决隐患。原大家提高警惕,共防视图遗毒。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册