复制SQL库
我有一个ETL Microsoft SQL Server 2014,它使用我所在组织的标准化命名约定,每月制作一个大型SQL Server数据库的副本 不幸的是,名称每月都会更改,因此如果我针对SQL Server数据库编写代码或制作仪表板,我必须更改几个进行查询的产品的名称 我想知道是否有可能创建一个指向另一个数据库的SQL Server数据库,这样我每个月都可以有一个不会更改的名称,并且不会占用服务器上的内存 例如,我现在有以下数据库副本:复制SQL库,sql,sql-server,Sql,Sql Server,我有一个ETL Microsoft SQL Server 2014,它使用我所在组织的标准化命名约定,每月制作一个大型SQL Server数据库的副本 不幸的是,名称每月都会更改,因此如果我针对SQL Server数据库编写代码或制作仪表板,我必须更改几个进行查询的产品的名称 我想知道是否有可能创建一个指向另一个数据库的SQL Server数据库,这样我每个月都可以有一个不会更改的名称,并且不会占用服务器上的内存 例如,我现在有以下数据库副本: Jan_2018 Feb_2018 Mar_201
Jan_2018
Feb_2018
Mar_2018
Apr_2018
etc.
我想制作一个名为curr_month的副本/版本,任何对它的查询都指向可用的最新月份 也许您可以使用 同义词是用于以下目的的数据库对象: 提供另一个数据库对象的替代名称,参考 作为基本对象,可以存在于本地或远程服务器上 提供保护客户端应用程序的抽象层 来自对基础对象的名称或位置所做的更改 其背后的想法是创建一个空数据库,其中包含自定义数据库中每个用户对象的同义词[Apr_2018] 因此,当[May_2018]交付时,需要重新创建同义词以指向该新数据库 当然,同义词的重新创建是自动化的
同义词不会消耗内存,而且与视图相反,如果底层对象的模式被修改,同义词不会破坏视图,正如Alexander所说,同义词是您的最佳选择。为了了解如何使这样的事情自动化,请参见下文。您可以继续运行它以获得它将运行的语句的输出,只要在您希望它实际执行任何操作时取消对所有exec sp_executesql@sql的注释即可
use [curr_month]
GO
SET NOCOUNT ON;
-- You could automate this even by creating a select off master.sys.databases
declare @database varchar(100) = 'AdventureWorks'
declare @table varchar(100)
declare @obj varchar(100)
declare @sql nvarchar(1000)
create table #names
(
ident int identity(1,1),
objname varchar(100)
)
declare @table_count int
declare @counter int
--------------------------------------
-- Get tables
--------------------------------------
truncate table #names
set @sql = 'select [name] from ' + @database + '.sys.tables where is_ms_shipped = 0 order by [name]'
INSERT INTO #names (objname)
exec sp_executesql @sql
set @table_count = (select coalesce(count(*),0) from #names)
set @counter = 1
WHILE (@table_count > 0 ANd @counter <= @table_count)
BEGIN
select @obj = objname
from #names
where ident = @counter
set @sql = 'CREATE SYNONYM [dbo].[' + @obj + '] FOR [' + @database + '].[dbo].[' + @obj + ']';
print @sql
--exec sp_executesql @sql
set @counter += 1
END
--------------------------------------
-- Get procedures
--------------------------------------
truncate table #names
set @sql = 'select [name] from ' + @database + '.sys.procedures where is_ms_shipped = 0 order by [name]'
INSERT INTO #names (objname)
exec sp_executesql @sql
set @table_count = (select coalesce(count(*),0) from #names)
set @counter = 1
WHILE (@table_count > 0 ANd @counter <= @table_count)
BEGIN
select @obj = objname
from #names
where ident = @counter
set @sql = 'CREATE SYNONYM [dbo].[' + @obj + '] FOR [' + @database + '].[dbo].[' + @obj + ']';
print @sql
--exec sp_executesql @sql
set @counter += 1
END
-- etc. if you have views, functions, etc...
drop table #names
在正常情况下,我的反应是将其全部存储在一个数据库中并修复表结构。然而,这似乎是某种存档过程,单独的数据库是合适的 这将是一个在数据库级别的想法。唉,这是不存在的 因此,我的建议是制定一个流程。在上载最近一个月后的每个月,请执行以下操作: 删除现有的当前数据库 创建一个新的当前数据库 为最近加载的数据中的所有现有表和视图创建视图或同义词。 为存储过程和函数创建同义词。 这应该是足够的——或者说远远不够
您可以使用动态SQL创建这些对象,动态SQL循环遍历新加载数据库中的相应对象。为什么要创建多个数据库?为什么不将所有数据放在一个数据库中?