有没有一种简单的方法可以为不同数据库中的所有表创建同义词?
谢谢
编辑:我有一些存储过程将一些表模式硬编码到选择查询中。当我将架构复制到新服务器时,SP 失败,因为架构不存在。我对目标服务器几乎没有控制权,我不想更改所有 SP,所以我认为同义词可能是一个很好的解决方案。
有没有一种简单的方法可以为不同数据库中的所有表创建同义词?
谢谢
编辑:我有一些存储过程将一些表模式硬编码到选择查询中。当我将架构复制到新服务器时,SP 失败,因为架构不存在。我对目标服务器几乎没有控制权,我不想更改所有 SP,所以我认为同义词可能是一个很好的解决方案。
您可以在原始数据库上运行这样的查询,然后在新数据库上运行输出结果。
select 'create synonym syn_' + t.name + ' for [' + DB_NAME() + '].[' + s.name + '].[' + t.name + ']'
from sys.tables t
inner join sys.schemas s
on t.schema_id = s.schema_id
where t.type = 'U'
例如,对 Master 数据库运行它会产生:
create synonym syn_spt_fallback_db for [master].[dbo].[spt_fallback_db]
create synonym syn_spt_fallback_dev for [master].[dbo].[spt_fallback_dev]
create synonym syn_spt_fallback_usg for [master].[dbo].[spt_fallback_usg]
create synonym syn_spt_monitor for [master].[dbo].[spt_monitor]
create synonym syn_spt_values for [master].[dbo].[spt_values]
create synonym syn_MSreplication_options for [master].[dbo].[MSreplication_options]
创建一个类似这样的存储过程:
CREATE PROCEDURE SynonymUpdate
@Database nvarchar(256), -- such as 'linkedserver.database' or just 'database'
@Schema sysname -- such as 'dbo'
AS
CREATE TABLE #Tables (
TableID int identity(1,1) NOT NULL PRIMARY KEY CLUSTERED,
Table_Name sysname
)
DECLARE
@SQL nvarchar(4000),
@ID int
SET @SQL = N'SELECT Table_Name FROM ' + @Database + '.INFORMATION_SCHEMA.TABLES WHERE Table_Schema = @TableSchema'
INSERT #Tables EXEC sp_executesql @SQL, N'@TableSchema sysname', @Schema
SELECT @ID = MAX(TableID) FROM #Tables
WHILE @ID > 0 BEGIN
SELECT @SQL = 'CREATE SYNONYM ' + Table_Name + ' FOR ' + @Database + '.' + @Schema + '.' + Table_Name FROM #Tables WHERE TableID = @ID
PRINT @SQL
--EXEC sp_executesql @SQL
SET @ID = @ID - 1
END
然后像这样运行它:
EXEC SynonymUpdate 'Database' , 'dbo'
请注意,您必须以具有创建同义词权限的用户身份运行它。如果您希望没有这些权限的用户运行它,在 SQL 2000 中没有运气,在 SQL 2005 中您可以在其中放置一个 EXECUTE AS 子句。
如果这是一个实例,并且两个数据库都在上面 - 使用三个名称表示法:
SELECT *
FROM database1.dbo.table_X
JOIN database2.dbo.table_Y ...
如果另一个数据库存在于单独的 SQL Server 实例上(您可以在一个盒子上拥有多个 SQL Server),或者该数据库存在于另一个盒子/VM 上的 SQL Server 实例上 - 创建一个链接服务器实例。然后使用四种名称表示法:
SELECT *
FROM database1.dbo.table_X
JOIN linked_server_name.database2.dbo.table_Y