SQL Server 2008 R2 生成脚本时出错

3
我正在尝试在SQL Server 2008 R2上生成数据库脚本。
我遇到了以下错误:
Microsoft.SqlServer.Management.Smo.PropertyCannotBeRetrievedException: 对于存储过程'[dbo].[p_SYS_GetQDNPassword]',属性TextHeader不可用。该属性可能不存在于此对象中,或由于权限不足而无法检索。该文本已加密。 在Microsoft.SqlServer.Management.SqlScriptPublish.GeneratePublishPage.worker_DoWork(Object sender, DoWorkEventArgs e) 中 at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e) at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)
请问你能帮忙吗?
我不知道您需要哪些其他信息,请告诉我,我会提供给您。

1
看起来这个存储过程是加密的,因此无法将其脚本化到文本文件中。 - marc_s
看起来你没有这张表的权限。我不确定需要哪些权限。你能对这张表运行 SELECT 语句吗?如果你在这张表上没有任何权限,我不确定你能否编写脚本。 - Vignesh Kumar A
@VigneshKumar 我正在使用Windows身份验证用户。因此,我确定我拥有所有权限。 - user3432257
@tHiNk_OuT_oF_bOx 实际上,这个数据库不是我的。我正在工作,另一位员工曾经创建过它。现在我必须继续处理它。不幸的是,这位员工已经离开了工作。 - user3432257
1
@tHiNk_OuT_oF_bOx 存储过程是 dbo.p_SYS_GetQDNPassword,所以你的意思是我需要尝试这个:sp_helptext dbo.p_SYS_GetQDNPassword 并执行它吗? - user3432257
显示剩余12条评论
2个回答

2

使用 sp_helptext dbo.p_SYS_GetQDNPassword 应该给你返回以下结果:

"对象 'YourProcedureName' 的文本已经被加密。"

这意味着该存储过程是使用 WITH ENCRYPTION 创建的,SQL Server 内部以混淆格式存储了对象定义的文本。

实际对象定义存储在系统表 sys.sysobjvalues 中,无法直接访问。通过使用专用管理员连接 (DAC) 连接到 SQL Server,您可以选择存储信息的 imageval 列。

点击“数据库引擎查询”按钮:

enter image description here

将弹出“连接到数据库引擎”对话框。在服务器名称之前键入 "admin:" 前缀,即可连接到 DAC。

enter image description here

您可以在此文章中找到有用的信息: http://www.mssqltips.com/sqlservertip/2964/encrypting-and-decrypting-sql-server-stored-procedures-views-and-userdefined-functions/

当您连接到 DAC 后,请运行此文章中的以下脚本:

   SET NOCOUNT ON
GO

ALTER PROCEDURE dbo.TestDecryption WITH ENCRYPTION AS
BEGIN
 PRINT 'This text is going to be decrypted'
END 
GO

DECLARE @encrypted NVARCHAR(MAX)
SET @encrypted = ( 
 SELECT imageval 
 FROM sys.sysobjvalues
 WHERE OBJECT_NAME(objid) = 'TestDecryption' )
DECLARE @encryptedLength INT
SET @encryptedLength = DATALENGTH(@encrypted) / 2

DECLARE @procedureHeader NVARCHAR(MAX)
SET @procedureHeader = N'ALTER PROCEDURE dbo.TestDecryption WITH ENCRYPTION AS '
SET @procedureHeader = @procedureHeader + REPLICATE(N'-',(@encryptedLength 
-   LEN(@procedureHeader)))
 EXEC sp_executesql @procedureHeader
 DECLARE @blankEncrypted NVARCHAR(MAX)
 SET @blankEncrypted = ( 
 SELECT imageval 
 FROM sys.sysobjvalues
 WHERE OBJECT_NAME(objid) = 'TestDecryption' )

SET @procedureHeader = N'CREATE PROCEDURE dbo.TestDecryption WITH ENCRYPTION AS '
SET @procedureHeader = @procedureHeader + REPLICATE(N'-',(@encryptedLength 
-   LEN(@procedureHeader)))

DECLARE @cnt SMALLINT
DECLARE @decryptedChar NCHAR(1)
DECLARE @decryptedMessage NVARCHAR(MAX)
SET @decryptedMessage = ''
SET @cnt = 1
WHILE @cnt <> @encryptedLength
BEGIN
  SET @decryptedChar = 
      NCHAR(
        UNICODE(SUBSTRING(
           @encrypted, @cnt, 1)) ^
        UNICODE(SUBSTRING(
           @procedureHeader, @cnt, 1)) ^
        UNICODE(SUBSTRING(
           @blankEncrypted, @cnt, 1))
     )
  SET @decryptedMessage = @decryptedMessage + @decryptedChar
 SET @cnt = @cnt + 1
END
SELECT @decryptedMessage

当然,在脚本中更改dbo.TestDecryption为您的存储过程名称 :)

这个脚本对我很有用,希望能帮到您


这个问题需要很长时间才能解决,同时,你可以帮我看一下这里的问题吗?http://stackoverflow.com/questions/22576818/what-is-the-connection-string-for-this-database 非常感谢。 - user3432257

1

使用

sp_helptext dbo.p_SYS_GetQDNPassword 

尝试更改存储过程并获取脚本。

我使用了那个查询,结果告诉我该对象已加密。那么,我该如何修改并解密它呢?我怀疑是否有办法。对吗? - user3432257
@user3432257,看一下这个链接,可能会对你有所帮助:http://forums.asp.net/t/1516587.aspx?How+can+i+decrypt+an+encrypted+stored+procedure+ - Revan
http://social.msdn.microsoft.com/Forums/sqlserver/en-US/e7056ca8-94cd-4d36-a676-04c64bf96330/decrypt-the-encrypted-store-procedure-through-the-tsql-programming-in-sql-server-2005 - Revan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接