存储过程
存储过程是独立于数据库之外的数据库对象,是SQL Server服务器上一组预编译的Transact-SQL语句,用于完成某项任务,它可以接收参数、输出参数、返回单个或多个结果集、返回状态值和参数值。存储过程独立于程序源代码,可单独修改。
创建存储过程
CREATE PROCEDURE 存储过程名
[@变量名 数据类型]
[ = 默认值 ]
[WITH ENCRYPTION|RECOMPILE]
[FOR REPLICATION]
as
<sql语句>
- WITH ENCRYPTION:存储过程加密,任何人都无法查看存储过程定义。WITH RECOMPILE:该过程在运行时编译
- FOR REPLICATION:指定不能再订阅服务器上执行为复制创建的存储过程。
- SQL语句:存储过程要执行的操作,但不能使用CREATE DEFAULT / CREATE TRIGGER / CREATE PROCEDURE / CREATE VIEW / CREATE RULE
示例:
use Student /*指定数据库,创建的存储过程会保存在数据库文件中*/
CREATE PROCEDURE cjjicx
@name varchar(50)
WITH ENCRYPTION --加密
as
select sno from S where sname=@name
go /*go作为批处理结束标志*/
执行存储过程
EXEC | EXECUTE
[@返回状态= ] [schema_name.] 存储过程名
[@形参 = ] [value]
WITH RECOMPILE]
示例:
use Student
exec cjjicx @name='小明'
go /* 批处理结束标志 */
修改存储过程
ALTER PROCEDURE 存储过程名
[@变量名 数据类型]
[ = 默认值 ]
[WITH ENCRYPTION]
[FOR REPLICATION]
as
<sql语句>
删除存储过程
DROP PROCEDURE 存储过程名
查看存储过程定义
- 显示存储过程的参数及数据类型:sp_help 存储过程名
- 显示存储过程源代码:sp_helptext 存储过程名
- 显示与存储过程相关的数据库对象:sp_depends ’ 存储过程名 ’
- 显示当前数据库中存储过程列表:sp_stored_prodedure ’ 存储过程名 ’
示例:
use Student
sp_helptext cjjicx
重命名存储过程
SP_RENAME 原存储过程名 , 新存储过程名
示例:
use Student
SP_RENAME cjjicx,cjjicx2 --将存储过程cjjicx更名为cjjicx2
go
触发器
触发器是特殊的存储过程,它也定义了一组SQL语句,用于完成某项任务。存储过程的执行是通过过程名字直接调用,而触发器是通过事件(如insert,update)进行触发而被执行。
创建触发器
CREATE TRIGGER 触发器名 ON 表名
[WITH ENCRYPTION] --文本加密
{FOR | AFTER | INSTESD OF}
[delete][,insert][,update]
as
[SQL语句]
- 触发器名不能以 # 或 ## 开头
- 视图只能被INSTEAD OF触发器引用
- AFTER:指定触发器只有在SQL所有操作以及所有引用级联操作和约束条件成功完成过后才触发。FOR:与AFTER等价。不能在视图上定义AFTER触发器。
- SQL语句:多于一个语句时用begin和end包括
示例:
/*该触发器的作用是:当用户向SC表中插入记录时,如果插入了在S表中没有的学生学号sno,
则提示用户不能插入记录,否则提示记录插入成功。
*/
use Student
CREATE TRIGGER insert_xh on SC
AFTER INSERT
as
begin
if(exists(select * from inserted join S on inserted.sno=S.sno))
begin
rollback tran /*取消insert操作*/
select '不能插入记录'
end
if(not exists(select * from inserted join S on inserted.sno=S.sno))
begin
select '插入记录成功'
end
end
go
修改触发器
ALTER TRIGGER 触发器名 ON 表名|视图
[WITH ENCRYPTION]
{FOR | AFTER | INSTESD OF}
[delete][,insert][,update]
as
[SQL语句]
删除触发器
DROP TRIGGER 触发器名
重命名触发器
SP_RENAME 原触发器名 , 新触发器名
本文章为作者的数据库实验报告总结,如有不当之处请大佬们批评!