我有两个数据库,为简单起见,这里称为 DB1 和 DB2。 DB1 是生产 DB,DB2 是开发环境,我正在努力在它们之间建立适当的 CICD 管道。然而,DB2 已被允许与 DB1 中的对象一起过时(不要问如何!)。
我需要为 DB1 中的所有视图批量生成 CREATE OR ALTER 脚本,以便我可以将它们应用到 DB2 以便将它们同步备份。
在常规 SQL Server 中,这可以在 SSMS 中使用“生成脚本”功能来实现。然而,Serverless 似乎没有这个功能,我不知道如何最好地实现这个功能。
我考虑过使用 Synapse Pipeline 来完成此操作,从 DB1.INFORMATION_SCHEMA.VIEWS 选择 VIEW_DEFINITION,但找不到可靠的方法将这些值修改为 CREATE 或 ALTERS 而不仅仅是 CREATE(因为如果该视图已存在于 DB2 上,90% 的情况都是如此)。
是否有人能够建议一种比手动将每个视图编写为 ALTER 脚本更快的方法?
为了在生产数据库 (DB1) 和开发环境 (DB2) 之间同步视图,以及为 DB1 中的所有视图使用
CREATE
或 ALTER
脚本。
您可以尝试以下方法:
DECLARE @queryDef NVARCHAR(MAX)
DECLARE view_cursor CURSOR FOR
SELECT 'IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(''' + QUOTENAME(o.name) + '''))
BEGIN
EXEC sp_executesql N''' +
REPLACE(REPLACE(UPPER(sm.definition), 'CREATE VIEW', 'ALTER VIEW'), 'DB1.', 'DB2.') + '''
END
ELSE
BEGIN
EXEC sp_executesql N''' +
REPLACE(UPPER(sm.definition), 'DB1.', 'DB2.') + '''
END'
FROM sys.sql_modules sm
JOIN sys.objects o ON sm.object_id = o.object_id
WHERE o.type = 'V'
OPEN view_cursor
FETCH NEXT FROM view_cursor INTO @queryDef
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @queryDef
FETCH NEXT FROM view_cursor INTO @queryDef
END
CLOSE view_cursor
DEALLOCATE view_cursor
上面的代码脚本循环遍历DB1中的所有视图 对于每个视图,它会检查该视图是否已存在于 DB2 中。 如果是这样,它就会改变视图;如果没有,它会创建视图。 接下来,通过将
CREATE VIEW
替换为 ALTER VIEW
并将引用从 DB1 更新为 DB2,来获取和调整视图定义。