我正在尝试在SQL Server 2008 R2上生成数据库的脚本
我收到了这个错误
Microsoft.SqlServer.Management.Smo.PropertyCannotBeRetrievedException:属性TextHeader不适用于StoredProcedure'[dbo]。[p_SYS_GetQDNPassword]'。此属性可能不存在,或者由于访问权限不足而无法检索。文本已加密。位于System.ComponentModel.BackgroundWorker.WorkerThreadStart(对象参数)的System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)上的Microsoft.SqlServer.Management.SqlScriptPublish.GeneratePublishPage.worker_DoWork(Object sender,DoWorkEventArgs e)
你能帮忙吗?
我不知道你需要什么其他信息,但无论你需要什么,请告诉我,给你。
答案 0 :(得分:2)
使用sp_helptext dbo.p_SYS_GetQDNPassword可以得到结果:
"对象' YourProcedureName'已加密。"
这意味着使用WITH ENCRYPTION创建存储过程,SQL Server在内部以模糊格式存储带有对象定义的文本
对象的实际定义存储在无法直接访问的系统表sys.sysobjvalues中。通过使用专用管理员连接(DAC)连接到SQL Server,您可以选择存储信息的imageval列
单击“数据库引擎查询”按钮:
将弹出“连接到数据库引擎”对话框。输入" admin:"服务器名称前的前缀,您将连接到DAC
您可以在本文中找到有用的信息 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 :)
这个脚本适合我,希望有帮助
答案 1 :(得分:1)
使用
sp_helptext dbo.p_SYS_GetQDNPassword
和 尝试更改存储过程并尝试获取脚本