假设我有两个名为DB1和DB2的数据库。在DB1中,有一个名为Student的表,在DB2中,有一个名为SP1的存储过程。在SP1中,我使用以下查询选择学生表的数据:
从DB1.dbo.Student中选择*。
我有超过300个具有上述交叉数据库通信的存储过程。现在,我想从数据和架构的角度将我的数据库从DB1更改为与DB1相同的DB3。 为此,我还必须修改具有完全限定数据库名称的所有300个存储过程。现在,查询可能如下:
从DB3.dbo.Student
中选择*我现在不想将所有存储过程更改为DB3,也不想将我在存储过程中编写的查询更改为动态SQL(我知道这可以通过创建动态SQL来完成)。
如果我们运行DB1.dbo.Student是可能的,它将重定向到DB3.dbo.Student。任何中间层或任何SQL设置。
对我来说这将是非常大的帮助。在此先感谢!!
答案 0 :(得分:1)
如果数据库重命名的目的是迁移数据库,那么为什么不自己重命名数据库呢?
e.g。说将DB1重命名为DB1_old,然后将DB3重命名为DB1
答案 1 :(得分:0)
我只需使用SQL Server脚本生成器工具编写所有存储过程的脚本。然后在脚本上找到替换并找到文本'DB1.dbo。'并替换为'DB3.dbo。'
将来您可能希望考虑使用同义词来引用外部表,那么您只需要更新同义词而不是所有过程。请参阅以下关于同义词的MSDN文章:
https://api.us.onelogin.com/auth/oauth2/token
使用同义词的示例:
USE [DB1]
GO
-- Create a synonym for table A located in DB2.
CREATE SYNONYM [dbo].[External_TableA] FOR [DB2].[dbo].[TableA]
GO
-- Synonym is pointing to TableA in DB2 , select statement will return data from DB2 tabla A.
SELECT *
FROM [External_TableA]
GO
-- Point the Synonym to same table but on DB3
DROP SYNONYM [dbo].[External_TableA]
CREATE SYNONYM [dbo].[External_TableA] FOR [DB3].[dbo].[TableA]
GO
-- No update was needed on views or stored procedure.
-- Synonym is pointing to TableA in DB3 , select statement will return data from DB3 tabla A.
SELECT *
FROM [External_TableA]
以下查询将生成所需的DROP和CREATE脚本,以将您的同义词从旧数据库重新映射到新数据库。
DECLARE @oldDB NVARCHAR(100) = 'DB2';
DECLARE @newDB NVARCHAR(100) = 'DB3';
SELECT 'DROP SYNONYM [dbo].[' + name + ']' AS [Drop Script]
,'CREATE SYNONYM [dbo].[' + name + '] FOR ' + REPLACE(base_object_name, @oldDB, @newDB) AS CreateScript
FROM sys.synonyms
ORDER BY name
答案 2 :(得分:0)
最好使用USE关键字
使用[您想要访问的数据库名称] 您要使用的查询和存储过程 GO
例如
use [db1]
select *from yourTableName
exec yourStoredProcedure parm1,parm2,....
Go