Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复制SQL库_Sql_Sql Server - Fatal编程技术网

复制SQL库

复制SQL库,sql,sql-server,Sql,Sql Server,我有一个ETL Microsoft SQL Server 2014,它使用我所在组织的标准化命名约定,每月制作一个大型SQL Server数据库的副本 不幸的是,名称每月都会更改,因此如果我针对SQL Server数据库编写代码或制作仪表板,我必须更改几个进行查询的产品的名称 我想知道是否有可能创建一个指向另一个数据库的SQL Server数据库,这样我每个月都可以有一个不会更改的名称,并且不会占用服务器上的内存 例如,我现在有以下数据库副本: Jan_2018 Feb_2018 Mar_201

我有一个ETL Microsoft SQL Server 2014,它使用我所在组织的标准化命名约定,每月制作一个大型SQL Server数据库的副本

不幸的是,名称每月都会更改,因此如果我针对SQL Server数据库编写代码或制作仪表板,我必须更改几个进行查询的产品的名称

我想知道是否有可能创建一个指向另一个数据库的SQL Server数据库,这样我每个月都可以有一个不会更改的名称,并且不会占用服务器上的内存

例如,我现在有以下数据库副本:

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循环遍历新加载数据库中的相应对象。

为什么要创建多个数据库?为什么不将所有数据放在一个数据库中?