关于加密存储过程

如何简单的创建一个加密存储过程:
create proc Test
(参数列表)
with encription
as
主体
go

为了演示,现在我们创建一个具备各种参数类型的存储过程作为测试:
create proc Test 
(
    @x 
int = 3,
    @s 
nvarchar(20),
    @y 
int output
)

with encryption
as

select @x, @s
set @y = 5
return 1
go
这个存储过程具备了输入参数,输出参数,返回值。
(关于返回值的题外话:返回值只能是 int 类型或者没有。默认情况下,系统存储过程都返回 0 表示调用成功,其他非零值表示失败。用户自定义的存储过程可以返回任意整数值)

现在调用一下这个存储过程试试:
declare @y int, @r int
exec @r = test 9'Hello', @y output
select @y
select @r

再来看一下这个存储过程的注释:
SELECT c.id, c.text 
FROM syscomments c INNER JOIN sysobjects o
   
ON c.id = o.id
WHERE o.name = 'Test'
可以发现是一些加密了之后的乱码。

如何得到加密存储过程的参数列表信息呢?有两个办法:
方法A:
select * from information_schema.parameters
where specific_name = 'Test'
这个方法返回的结果集里没有包含返回值的信息。

方法B:
sp_procedure_params_rowset 'Test'1'dbo'
这个语句返回的比上面那个多一行返回值信息。

注意到他们返回的其他列信息也不同。比如 PROCEDURE_NAME(存储过程名),方法B返回的是:
Test;1
后面这个 1 表示 Group Number.

参考:
http://sqljunkies.com/WebLog/roman/archive/2004/10/08/4539.aspx

posted on 2005-03-18 11:19  NeilChen  阅读(1614)  评论(1编辑  收藏  举报

导航