Ago*_*ony 6 sql-server-2005 sql-server-2008 stored-procedures
我通常可以使用生成脚本/ DTS 来移动数据和表等。但是,其中一个数据库有大量的加密程序,我无法通过脚本来移动它们。
我也没有旧的 2005 年数据库备份。
我没有手动恢复解密程序。
有什么办法可以复制/移动它们吗?
几年前我自己也遇到过这个问题。但是,因为 SQL Server 实际上并没有“加密”您创建的对象(它会混淆它们),所以您可以很容易地逆转混淆过程以恢复定义。我使用以下过程来编写加密对象的脚本:
CREATE PROCEDURE dbo.ShowDecrypted(@ProcName SYSNAME = NULL)
AS
--Jon Gurgul 27/09/2010
--Adapted idea/code from shoeboy/joseph gama
SET NOCOUNT ON
IF EXISTS
(
SELECT * FROM sys.dm_exec_connections ec JOIN sys.endpoints e
on (ec.[endpoint_id]=e.[endpoint_id])
WHERE e.[name]='Dedicated Admin Connection'
AND ec.[session_id] = @@SPID
)
BEGIN
DECLARE @i BIGINT,@a NVARCHAR(MAX),@b NVARCHAR(MAX),@d NVARCHAR(MAX),@c NVARCHAR(MAX)
SET @a=(SELECT [imageval] FROM [sys].[sysobjvalues] WHERE [objid] = OBJECT_ID(@ProcName) and [valclass] = 1 and [subobjid] = 1)
SET @b='ALTER PROCEDURE '+ @ProcName +' WITH ENCRYPTION AS '+REPLICATE('-', 8000)
BEGIN TRANSACTION
EXECUTE (@b)
SET @c=(SELECT [imageval] FROM [sys].[sysobjvalues] WHERE [objid] = OBJECT_ID(@ProcName) and [valclass] = 1 and [subobjid] = 1)
ROLLBACK TRANSACTION
SET @d = REPLICATE(N'A', (DATALENGTH(@a) /2 ))
SET @i=1
WHILE @i<=(DATALENGTH(@a)/2)
BEGIN
SET @d = STUFF(@d, @i, 1,NCHAR(UNICODE(SUBSTRING(@a, @i, 1)) ^(UNICODE(SUBSTRING('CREATE PROCEDURE '+ @ProcName +' WITH ENCRYPTION AS ' + REPLICATE('-', 8000), @i, 1)) ^UNICODE(SUBSTRING(@c, @i, 1)))))
SET @i=@i+1
END
SELECT @d [StoredProcedure]
END
ELSE
BEGIN
PRINT 'Use a DAC Connection'
END
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
Run Code Online (Sandbox Code Playgroud)
可以找到的原始文章是 http://social.msdn.microsoft.com/Forums/en/transactsql/thread/e7056ca8-94cd-4d36-a676-04c64bf96330
我希望这对你有帮助。