42. SQL -- 存储过程(3)

看、修改和除存储过

A看存储过

储过程被建以后,它的名字存放在当前数据的系sysobjects中,建它的源代存放在syscomments表中。可以通SQL Server 2000提供的几个系储过程来看用储过程的有信息。

1 .T-SQL看存储过

看存储过程的定

储过sp_helptext未加密的存储过程的定脚本,也可用于规则、默认值、用函数、触器或视图的定脚本。使用其法如下:

sp_helptext [@objname=]‘name‘

其中:[@objname=]‘name‘ 象的名称,要看的象必在当前数据中。储过程名。例如,sp_helptext proc_Add,可示存储过proc_Add的定脚本。

DEMO:

sp_helptextproc_add

看有储过程的信息

使用系储过sp_help看有储过程的信息。具体法形式如下:

sp_help proc_name

其中:proc_name:要看的存储过程名。

行上面的句后,系将返回指定存储过程的名称、有者、型和时间,并且返回个存储过程所有参数的名称、型、度、精度和默认值等信息。

DEMO:

sp_helpproc_add

2 . 使用SQL ServerManagement Studio看存储过

(1)器。

(2)�D数据库‖�D程性�D储过

(3)需要看的存储过程,然后单击�D属性命令,系出如下�D储过程属性窗口。

(4)�D规‖,可以看到储过程属于哪个数据建日期,属于哪个数据等信息。

(5)�D,可以为该储过程添加用并授予其限。

修改存储过

1 . 使用T-SQL句修改存储过

Transact-SQL中提供了ALTER PROCEDURE句来更改已经创建的存储过程,它不会更改限,也不影响相的存储过程或触器。它的法如下所示:

ALTER PROC [ EDURE ] procedure_name

[ {@parameter data_type }

[ VARYING ] [ = default ] [ OUTPUT ]

] [,...n ]

[ WITH

{ RECOMPILE |ENCRYPTION

| RECOMPILE , ENCRYPTION

}

]

[ FOR REPLICATION ]

AS

sql_statement[ ...n ]

DEMO:修改之前建的存储过proc_add,使储过加密状

alterPROCEDURE proc_Add

@Value1INT,

@Value2INT,

@ResultValueINT OUTPUT

withencryption

AS

SELECT@ResultValue = @Value1 + @Value2

GO

2 、使用SQL ServerManagement Studio修改存储过

SQL Server Management Studio中修改存储过程的步骤如下:

(1)器。

(2)�D数据库‖�DJWGL�D程性�D储过

(3)需要修改的存储过程,然后单击�D修改命令。

(4)行存储过程的修改。

删除存储过程

于不再需要的存储过程,可将其除。可以使用SQL句,也可以使用SQL ServerManagement Studio

1 . 使用SQL除存储过

从当前数据除一个或多个存储过程的T-SQL句是 DROP PROCEDURE法:

DROP PROCEDURE {procedure} [,…n]

其中参数:

procedure:是要除的存储过程的名称。

n:表示可以指定多个存储过程。

例如,要将proc_Add储过除,可以

DROP PROC proc_Add

2 、使用SQL ServerManagement Studio除存储过

使用SQL Server Management Studio除存储过程的步骤如下:

1)展器。

2)分�D数据库‖�DJWGL�D程性�D储过

3)右需要除的存储过程,然后单击�D命令。

4)在系统弹出的�D‖对话框中点�D确定即可储过程。

注册展存储过程:

1 . 使用T-SQL句注册展存储过

SQLServer 的系管理储过sp_addextendedproc来添加一个展存储过程到系master数据中。个操作称注册展存储过程。

sp_addextendedproc储过程的具体法:

sp_addextendedproc[@functname=] 'procedure', [@dllname=] 'dll'

其中:

[@functname=] 'procedure':是在动态链(DLL)用的函数名称。

[ @dllname = ] 'dll':包含函数的DLL名称。

sp_addextendedproc将新的条目(函数名称)添加到sysobjects中,在SQL

Server注册新展存储过程名称,同syscomments表中添加一个条目。

DEMO经编写好了一个名xp_hello.dll动态链,其中有一个函数叫xp_hello,我使用以下的句来把xp_hello添加到SQL Server中。

USEmaster

EXECsp_addextendedprocxp_helloxp_hello.dll

2 、使用SQL ServerManagement Studio注册展存储过

SQL Server Management Studio中,注册展存储过程的步骤如下:

1)展,然后展器。

2)展�D数据库‖文件,再展master数据

3)右�D展存储过,然后单击�D新建展存储过命令。

4)在�D名称框中展存储过程的名称。

5)在�D路径中,入包含此展存储过程的动态链的路径。单击�D...)按找包含此展存储过程的 DLL

 

建存储过

 

建存储过实现码验证

select* from orders

原始表格记录

docnodocdate cust carrency rate

p022 0 1 1 - 0 8 - 1 6 00:00:00.000 microsoft CH 6000.0000

p032 0 1 1 - 0 8 - 1 6 00:00:00.000 bcUSA7000.0000

p042 0 1 1 - 0 8 - 1 6 00:00:00.000 microsoft USA 6000.0000

--1、在orders 表中增加一列[userpasswd] [varbinary](256) NULL,

ALTERTABLE dbo.orders ADD

userpasswordvarbinary(256) NOT NULL

CONSTRAINTDF_orders_userpasswordDEFAULT convert(varbinary(256),

pwdencrypt('passw0rd'))

GO

--2置一个初始密

updateorders

set userpassword = convert(varbinary(256), pwdencrypt('passw0rd'))

--3、用SELECT验证一下密,使用微未公的解密函数pwdcompare,表示失,表示验证

selectpwdcompare('passward', userpassword),* from orders

selectpwdcompare('passw0rd', userpassword),* from orders

--4建一个存储过程,若密成功print wellcomeThe user name or password is incorrect.

if exists

(select *

fromsys.sysobjects

whereid=object_id(N'pr_checkpassword')

andxtype='P')

dropproc pr_checkpassword

go

CREATEPROCEDURE pr_checkpassword

(@userid varchar(10) , @userpassword nvarchar(256) )

withencryption

as

if (isnull(@userid,'')='' or isnull(@userpassword,'')='')

begin

print'请输入用名或密'

return-1000

end

if exists (select 1

fromorders

wheredocno=@userid

andpwdcompare(@userpassword, userpassword)=1)

begin

print'码验证成功!'

return-1000

end

else

begin

print'码验证'

return-1000

end

go

--看效果

execpr_checkpassword'A01','0' --码验证

execpr_checkpassword'','' --请输入用名或密

execpr_checkpassword'p02','passw0rd' --码验证成功!

return 的存储过

use mydb

go

select* from orders

--1验证是否存在名称pr_checkpassword储过程,若有,则删除此存储过

if exists

(select *

fromsys.sysobjects

whereid=object_id(N'pr_checkpassword')

andxtype='P')

dropproc pr_checkpassword

go

--2建存储过

CREATEPROCEDURE pr_checkpassword

(@userid varchar(10) , @userpassword nvarchar(256) )

withencryption

AS

declare@rtn int

select@rtn = 1

if not exists

(select *

fromorders

wheredocno = @userid)

begin

select@rtn = -1000

select@rtn

return@rtn

end

if not exists

(select *

fromorders

wheredocno = @userid

and(pwdcompare(@userpassword, userpassword) = 1))

begin

select@rtn = -1000

select@rtn

return@rtn

end

select@rtn

return@rtn

GO

--3看效果

executedbo.pr_checkpassword @userid = 'p01', @userpassword ='passw0rd'

go-- 入正确的userid userpassword

返回果:

1

executedbo.pr_checkpassword @userid = 'A01', @userpassword ='passw0rd'

go-- 错误userid userpassword

返回果:

-1000

添加事的存储过

--1验证是否存在名称pr_procedure_name储过程,若有, .除此存 .

if exists

(select *

fromsysobjects

whereid = object_id('dbo.pr_procedure_name'))

dropprocedure dbo.pr_procedure_name

go

--2建存储过

createprocedure dbo.pr_procedure_name

@v_spartvarchar(30),

@v_epartvarchar(30)

as

declare@l_trancnt int

是不断累及重程,当学习变成一种习惯候,就真正入了学的殿堂!

280 588

select@l_trancnt = @@trancount

if @l_trancnt = 0

begintran tran_pr_procedure_name

else

savetran tran_pr_procedure_name

--处输入要行的句,若报错则

if @@error <> 0

begin

rollbacktran tran_pr_procedure_name

return99999

end

--行下一条句,若报错则

if @@error <> 0

begin

rollbacktran tran_pr_procedure_name

return99999

end

if @l_trancnt = 0

committran

return0

go

务处:

bgeintran

rollbacktran

cummittran

rollback tran:在事务处理中,当一个逻辑,就全部rollback(回

行以下句:

begingtran tran_name

updateemployee set address = 'address'

时虽然提示行成功,但实际上并未提交句,若此时进查询则查询不出来(定了),等待上一条句的成功行。若使用select * from employee (nolock),允许读取未提交的数据即使未提交,也可取,但取的料是上一条句更后的数据rollback tran tran_name

,回到未更新前状cummit trantran_name

提交事

 

参数的存储过

--1验证是否存在名称proc_time储过程,若有,则删除此存储过

if exists

(select *

fromsysobjects

whereid = object_id('dbo.proc_time'))

dropprocedure dbo.proc_time

go

--2参数的存储过程,当入参数where中条件,返回查询结

createproc proc_time

@emp_idvarchar(20),@sign_time datetime

as

selectclock_id,emp_id,sign_time

fromTimeRecords

whereemp_id = @emp_id

andconvert(char(10),sign_time,121) = @sign_time

--3行存储过

返回emp_id= P1103891,打卡日期2011-06-10的打卡记录

execproc_time 'P1103891','2011-06-10'

返回:

 


你可能感兴趣的:(数据库,加密,触发器,源代码)