【问题标题】:Create a procedure with Alter Database option使用 Alter Database 选项创建过程
【发布时间】:2019-05-01 05:28:01
【问题描述】:

我有 30 多个使用 TDE 加密的数据库。现在我必须在不加密的情况下对每个数据库进行备份。 需要以下步骤: - 关闭加密 - 对该数据库进行完整备份 - 设置加密

(抱歉,我不太擅长编码)

这是我到目前为止所做的一个例子:

use [Testt]
ALTER DATABASE [Testt] 
SET ENCRYPTION OFF
Go


BACKUP DATABASE [Testt] 
TO  DISK = N'J:\Backup\Testt_full.bak ' WITH NOFORMAT,COPY_ONLY, NOINIT,  
NAME = N'J:\Testt', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO 

GO
use [Testt]
ALTER DATABASE [Testt] 
SET ENCRYPTION ON
GO

对于 30 dbs,有没有更简单的方法来做到这一点?我想到了一个过程或一个光标

【问题讨论】:

  • 查看 sp_msforeachdb
  • 我首先建议在事务中完成整个事情。其次,我认为从像 powershell 这样的脚本平台运行它应该是最简单的。
  • @Zohar Peled:备份是否加入事务?......
  • @MitchWheat 我不知道备份我认为设置加密...
  • AFAIK 他们没有......

标签: sql-server tsql encryption database-backups tde


【解决方案1】:

感谢克劳迪奥·比塞利的帮助:

我调整了你的光标部分:

DECLARE @dbName nvarchar(MAX) =''
DECLARE @sql nvarchar(MAX) = ''
DECLARE @sql2 nvarchar(MAX) = ''
DECLARE @sql3 nvarchar(MAX) = ''

DECLARE Crs CURSOR LOCAL FOR 
SELECT d.name
FROM sys.databases d
INNER JOIN
sys.dm_database_encryption_keys e ON d.database_id = e.database_id
where d.name not like 'tempdb'

OPEN Crs 
FETCH NEXT FROM Crs into @dbName 

WHILE @@FETCH_STATUS = 0

BEGIN


SET @sql= 'use ' + @dbName +
' ALTER DATABASE ' + @dbName + ' SET ENCRYPTION OFF'
select @sql


SET @sql2='BACKUP DATABASE ' + @dbName +
' TO  DISK = ''J:\Backup\' + @dbName + '_full.bak'' WITH NOFORMAT, COPY_ONLY, NOINIT, NAME = ''J:\'+ @dbName + ''', SKIP, NOREWIND, NOUNLOAD, STATS = 10'
select @sql2


SET @sql3= 'use ' + @dbName +
' ALTER DATABASE ' + @dbName + ' SET ENCRYPTION ON'
select @sql3

FETCH NEXT FROM Crs into @dbName 
END
CLOSE Crs
DEALLOCATE Crs

它有效:)

【讨论】:

    【解决方案2】:

    在#tmp 中存储您的数据库名称

    DECLARE @dbName nvarchar(MAX) =''
    DECLARE @sql nvarchar(MAX) = ''
    
    DECLARE Crs CURSOR LOCAL FOR 
    SELECT data
    FROM #tmp 
    
    
    OPEN Crs 
    FETCH NEXT FROM Crs into @dbName 
    
    WHILE @@FETCH_STATUS = 0
    
    BEGIN
    
    
    
    SET @sql= 'use' + @dbName +
    'ALTER DATABASE' + @dbName +
    'SET ENCRYPTION OFF'
    
    EXEC(@sql)
    
    DECLARE @dName nvarchar(MAX) = 'J:\\' + @dbName 
    DECLARE @dPath nvarchar(MAX) = 'J:\\Backup\\' + @dbName + '_full.bak'
    
    SET @sql='BACKUP DATABASE ' + @dbName +
    'TO  DISK = '+ @dPath +' WITH 
    NOFORMAT,COPY_ONLY, NOINIT,  
    NAME = '+ @dName  +', SKIP, NOREWIND, NOUNLOAD,  STATS = 10'
    
    EXEC(@sql)
    
    SET @sql= 'use  ' + @dbName +
    'ALTER DATABASE  ' + @dbName +
    'SET ENCRYPTION ON'
    
     EXEC(@sql)
    
    FETCH NEXT FROM Crs into @dbName 
    
    
    END
    
    
    CLOSE Crs
    
    DEALLOCATE Crs          
    

    【讨论】:

    • 首先,感谢您的帮助...当我尝试光标部分时,我收到以下错误消息:Msg 102, Level 15, State 1, Line 27 Incorrect syntax near '\ '。消息 132,级别 15,状态 1,第 28 行 标签“J”已被声明。标签名称在查询批处理或存储过程中必须是唯一的。
    猜你喜欢
    • 2016-03-06
    • 2013-10-14
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    相关资源
    最近更新 更多