从 Synapse Serverless SQL 池批量复制数据库对象

问题描述 投票:0回答:1

我有两个数据库,为简单起见,这里称为 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 脚本更快的方法?

sql database serverless azure-synapse
1个回答
0
投票

为了在生产数据库 (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,来获取和调整视图定义。

参考: 有没有办法使用tsql脚本替换代码并更新视图

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.