在 SQL Server 2017 中,我有一个视图“ParentView”,它被其他视图“ChildView1”、“ChildView2”等引用。这些视图被其他视图“GrandChildView1”、“GrandChildView2”等引用,等等向前。我确保将所有视图设置为具有“WITH SCHEMABINDING”。当我想更改“ParentView”时,我需要删除并创建所有相关视图。当然,这非常有意义,因为我启用了“WITH SCHEMABINDING”,并且我可能会做出可能破坏其中一个依赖视图的更改。然而,通过用户界面做所有这些是乏味的,所以我想知道......
我怎样才能获得一个将视图或任何对象作为输入并根据依赖关系创建删除/创建语句的脚本?
例如:
DROP VIEW [dbo].[GrandChild]
GO
DROP VIEW [dbo].[Child]
GO
ALTER VIEW [dbo].[Parent]
...
GO
CREATE VIEW [dbo].[Child]
...
GO
CREATE VIEW [dbo].[GrandChild]
...
GO
笔记
- 这不必特定于视图。我也有依赖函数和存储过程。
- 我的观点都不是索引视图。
我找到了一种通过使用几个不同的脚本来执行此操作的方法。
首先,我需要设置来自 Greg M. Lucas 的“PrintString”存储过程,以便打印我的所有语句而不截断它们。
其次,我创建了一个临时表来存储所有相关实体,以便稍后可以使用它来打印我的脚本。临时表中包含一个“顺序”列,用于对删除语句进行降序排列,对创建语句进行升序排列。
第三,我使用递归 CTE 填充我的临时表。在此示例中,我的父视图称为“dbo.Project_Expanded”。
第四,我创建了 drop 语句,然后使用临时表创建了 create 语句,然后复制了结果。请注意,我的版本仅处理内联表值函数、过程和视图。如果您需要处理更多对象类型,则需要对其进行更新。
最后,我清理临时表并删除“PrintString”过程: