gpt4 book ai didi

sql-server - 更新多个数据库上的存储过程

转载 作者:行者123 更新时间:2023-12-02 13:02:24 26 4
gpt4 key购买 nike

我们为每个客户都有一个单独的数据库。它们都有相同的表和存储过程。问题是当我们必须更新存储过程时,我们必须确保为所有数据库更新它。当然,数据库上的一个存储过程可能会被忽略并且不会更新。

我研究了在master中创建一个存储过程,并为其添加了sp_前缀,并使用sys.sp_MS_marksystemobject将该对象标记为系统对象。这似乎有效......但是,这个 article说“不建议将此解决方案用于实时数据库服务器,您可以在开发和测试服务器中使用它来加快您的开发和测试。”

如果是这种情况,最佳的生产解决方案是什么?

最佳答案

如果目标基本上只是将存储过程部署到每个客户端数据库,那么像这样的脚本应该可以工作。

-- put the entire stored procedure code in a variable
-- have it start with "PROC" so we can easily either create or alter the
-- procedure based on whether it already exists or not
DECLARE @sp_code NVARCHAR(MAX) =
'
PROC [dbo].[usp_some_proc] AS
SELECT DB_NAME()
'

-- get a list of databases to install the stored procedure to
SELECT
[name]
INTO #tbl_databases
FROM sys.databases
WHERE [name] LIKE 'db[_]client[0-9]'

-- define some variables to use in the loop
DECLARE @sql NVARCHAR(MAX);
DECLARE @execute_sql NVARCHAR(MAX);
DECLARE @database_name NVARCHAR(500);

-- iterate through each database
WHILE EXISTS (SELECT * FROM #tbl_databases)
BEGIN

-- get this iteration's database
SELECT TOP 1
@database_name = [name]
FROM #tbl_databases

-- determine whether stored procedure should be created or altered
IF OBJECT_ID(QUOTENAME(@database_name) + '.[dbo].[usp_some_proc]') IS NULL
SET @sql = 'CREATE' + @sp_code;
ELSE
SET @sql = 'ALTER' + @sp_code;

-- define some dynamic sql to execute against the appropriate database
SET @execute_sql = 'EXEC ' + QUOTENAME(@database_name) + '.[dbo].[sp_executesql] @sql';

-- execute the code to create/alter the procedure
EXEC [dbo].[sp_executesql] @execute_sql, N'@sql NVARCHAR(MAX)', @sql;

-- delete this database so the loop will process the next one
DELETE FROM #tbl_databases
WHERE [name] = @database_name

END

-- clean up :)
DROP TABLE #tbl_databases

您也许可以通过从 sys.sql_modules 中提取过程定义来做一些巧妙的事情,但在执行 CREATE 与 ALTER 时可能会遇到一些复杂情况。

关于sql-server - 更新多个数据库上的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22948927/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com