与许多企业一样,我们拥有实时环境和开发环境。由于我无法控制的原因,开发环境无法存储实时环境中的所有内容。因此,当需要刷新dev env时,DBA必须手动复制每个表的样本(例如,最近6个月的数据)。
有谁知道这种方式可以实现自动化?我知道存在部分备份这样的事情,但是有关备份不同文件组的事情。差异备份也不好,因为尽管我们的数据很多,但我们需要的不仅仅是已更改的数据。
编辑:重读这一点,我应该澄清一点,我们也没有时间写一个冗长的定制脚本来完成任务:(
提前致谢!
答案 0 :(得分:0)
快照复制可以是一个选项。 您可以在不同的文章(表格)上放置过滤器,以仅复制数据样本。 在第一次运行时编写此脚本,然后重新使用。
下一步是安排这些脚本每周/每月运行(您希望它刷新的时间段)。
答案 1 :(得分:0)
这样的事情会产生插入语句,以防你要创建一些东西。但是,从我的头顶开始,未经测试。
DECLARE @v_SourceDatabase NVARCHAR(250);
DECLARE @v_DestinationDatabase NVARCHAR(250);
DECLARE @t_TablesToProcess TABLE (FullTableName NVARCHAR(250),
TableName NVARCHAR(250),
TableSchema NVARCHAR(250),
ColumnList NVARCHAR(MAX));
DECLARE @v_ColumnList NVARCHAR(MAX);
DECLARE @v_TableName NVARCHAR(250);
DECLARE @v_TableSchema NVARCHAR(250);
-- -------------------------------------- --
-- Set Source & destination database here --
-- -------------------------------------- --
SET @v_SourceDatabase = N'DatabaseSource';
SET @v_DestinationDatabase = N'DatabaseDestination';
-- Generate tables to process
INSERT INTO @t_TablesToProcess
SELECT CONCAT('[', syssch.name, '].[', systab.name, ']') FullTableName
, systab.name
, syssch.name
, NULL
FROM sys.tables systab
INNER JOIN sys.schemas syssch
ON syssch.schema_id = systab.schema_id
WHERE type = 'U';
DECLARE TableList CURSOR FAST_FORWARD FOR
SELECT TableName, TableSchema
FROM @t_TablesToProcess;
OPEN TableList;
FETCH NEXT FROM TableList INTO @v_TableName, @v_TableSchema;
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @v_ColumnList = CONCAT(@v_ColumnList, N'[', column_name, N'], ')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @v_TableName
AND TABLE_SCHEMA = @v_TableSchema
SET @v_ColumnList = LEFT(@v_ColumnList, LEN(@v_ColumnList) - 1);
UPDATE @t_TablesToProcess
SET ColumnList = @v_ColumnList
WHERE TableName = @v_TableName
AND TableSchema = @v_TableSchema;
SET @v_ColumnList = '';
FETCH NEXT FROM TableList INTO @v_TableName, @v_TableSchema;
END
CLOSE TableList;
DEALLOCATE TableList;
-- Generate insert statements
SELECT CONCAT(N'IF (OBJECTPROPERTY(OBJECT_ID(''', FullTableName, '''), ''TableHasIdentity'') = 1) SET IDENTITY_INSERT ', FullTableName, N' ON; '
, N'INSERT INTO [', @v_DestinationDatabase, N'].', FullTableName
, N' (', ColumnList, N')'
, N' SELECT * FROM [', @v_SourceDatabase, N'].', FullTableName, N';'
, N' IF (OBJECTPROPERTY(OBJECT_ID(''', FullTableName, '''), ''TableHasIdentity'') = 1) SET IDENTITY_INSERT ', FullTableName, N' OFF; ')
FROM @t_TablesToProcess;