1、前言

2、存储过程和触发器
-》存储过程
·理解:是一组SQL命令集合,经过预编译存放在系统中;就像java程序里的方法,可以重复的被调用;
在日常的数据库操作中,会有大量的T-SQL批处理、游标,如果每次都要去重写或者打开脚本来执行会相当麻烦,
数据库可以将我们编写的T-SQL批处理保存在一个处理过程中。
--创建
·语法格式:create {proc | procedure} 存储名 [ @参数名 数据类型 [,···n] ]
as
[begin]
sql语句[块]
[end]
·例:无参数:create procedure stduent_avg
as
select 学号,avg(成绩) as '平均分' from 选课表
group by 学号
go

有参数:create procedure GetStu @number char(7)
as
select * from 学生表 where 学号=@ number
go
输出参数: create procedure Pname @p_n varchar(20),@avgage int output
as /*output表明该选项的值可以返回给调用此过程的应用程序*/
select @ avgage=avg(单价) from 商品 where 商品名称=@ p_n
go
--执行
·语法格式:execute {proc | procedure} 存储名 [ @参数名 数据类型 [,···n] ]
·例:无参数:execute stduent_avg
有参数:execute GetStu '0100111'
输出参数:declare @ avgage int
execute Pname '冰箱',@ avgage output
print '冰箱的平均价格:' + str(@ avgage)
--查看
·语法格式: sp_help 存储过程名 /*表的形式*/
sp_helptext 存储过程名 /*文本打印的形式*/
·例:
--修改: alter procedure 存储过程名 [参数]
as
sql语句[块]
go
--删除: drop procedure 存储过程名

-》触发器
·解释:一种特殊的存储过程;
它不是由用户主动发起调用的,而是当发生某一事件(表发生新增、修改、删除操作时)而触发,由系统自动调用。
·作用:
·分类:DML触发器:发生数据操作语言事件时自动执行存储过程
DDL触发器:响应DDL语句触发
·语法格式:create trigger 触发器名
on {表名 | 视图}
[with encryption] /*加密syscomments表中包含create trigger语句条目*/
{for | after | instead of} /*after:所有操作成功执行后才激活;instead of:指执行触发器而不执行触发语句*/
{[insert][delete][update]} /*执行哪个数据修改语句激活触发器的关键字*/
[not for replication] /*复制进程更改触发器所涉及的表时,不应执行该触发器*/
as sql语句[块]
·例1:为学生表创建一个DML触发器,在插入和修改数据时,都会自动显示所有学生的信息
create trigger print_table on 学生表
for insert,update
as select * from 学生表
·例2:使用DDL触发器limited来防止数据库中的任一表被修改和删除
use 教学库
go
create trigger limited on database
for drop_table,alter_table
as
print '不允许您执行对表的修改或删除操作'
rollback
·例3:创建一个delete类型的触发器,删除数据时,显示删除学生个数
create trigger del_table on 学生表
for delete
as
declare @count vachar(50)
select @count = str(@@rowcount) + '个学生被删除'
select @count
return
·查看:sp_help 触发器名
sp_helptext 触发器名
sp_helptrigger 表名 /*查看某个表上的触发器*/
·修改: alter trigger 触发器名
on {表名 | 视图}
[with encryption] /*加密syscomments表中包含create trigger语句条目*/
{for | after | instead of} /*after:所有操作成功执行后才激活;instead of:指执行触发器而不执行触发语句*/
{[insert][delete][update]} /*执行哪个数据修改语句激活触发器的关键字*/
[not for replication] /*复制进程更改触发器所涉及的表时,不应执行该触发器*/
as sql语句[块]
·禁止、启用和删除
--启用、禁止:alter table 表名
[enable | disable] trigger [all | 触发其名[,···n]]
/*启用或禁止所用或某个触发器*/
--删除:drop trigger 触发器名

第五章 存储过程&触发器的更多相关文章

  1. 《Entity Framework 6 Recipes》中文翻译系列 (22) -----第五章 加载实体和导航属性之延迟加载

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第五章 加载实体和导航属性 实体框架提供了非常棒的建模环境,它允许开发人员可视化地使 ...

  2. 2019寒假训练营第三次作业part1-网络空间安全概论第五章

    第五章 网络攻防技术 5.1 网路信息收集技术--网络踩点 黑客入侵系统之前,需要了解目标系统可能存在的: 管理上的安全缺陷和漏洞 网络协议安全缺陷与漏洞 系统安全缺陷与漏洞 黑客实施入侵过程中,需要 ...

  3. 2020重新出发,MySql基础,MySql视图&索引&存储过程&触发器

    @ 目录 视图是什么 视图的优点 1) 定制用户数据,聚焦特定的数据 2) 简化数据操作 3) 提高数据的安全性 4) 共享所需数据 5) 更改数据格式 6) 重用 SQL 语句 MySQL创建视图 ...

  4. 《Django By Example》第五章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag注:大家好,我是新来的翻译, ...

  5. 精通Web Analytics 2.0 (7) 第五章:荣耀之钥:度量成功

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第五章:荣耀之钥:度量成功 我们的分析师常常得不到我们应得的喜欢,尊重和资金,因为我们没有充分地衡量一个黄金概念:成果.因为我们 ...

  6. 《Linux内核设计与实现》读书笔记 第五章 系统调用

    第五章系统调用 系统调用是用户进程与内核进行交互的接口.为了保护系统稳定可靠,避免应用程序恣意忘形. 5.1与内核通信 系统调用在用户空间进程和硬件设备间添加了一个中间层, 作用:为用户空间提供了一种 ...

  7. Java语言程序设计(基础篇) 第五章 循环

    第五章 循环 5.2 while循环 1.while循环的语法如下: while(循环继续条件){ //循环体 语句(组); } 2.程序:提示用户为两个个位数相加的问题给出答案 package co ...

  8. 读《编写可维护的JavaScript》第五章总结

    第五章 UI层的松耦合 5.1 什么是松耦合 在Web开发中,用户界面是由三个彼此隔离又相互作用的层定义的: HTML是用来定义页面的数据和语义 CSS用来给页面添加样式 JavaScript用来给页 ...

  9. 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳

    <Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...

随机推荐

  1. 洛谷U41492(树上启发式合并)

    提交通道 洛谷日报 考虑非\(O(n^2)\)的预处理.一遍dfs时,check某颜色有没有的数组何时清空很尴尬:得到某树答案后如果不清,则影响接下来兄弟树的搜索:如果清了,父亲节点又难以收集答案. ...

  2. NowCoder数列(矩阵快速幂变式)

    时间限制 3000 ms 内存限制 32768 KB 代码长度限制 100 KB 题目描述 NowCoder最近在研究一个数列: * F(0) = 7 * F(1) = 11 * F(n) = F(n ...

  3. 1065. A+B and C (64bit) (20)

    Given three integers A, B and C in [-263, 263], you are supposed to tell whether A+B > C. Input S ...

  4. python3 repr()函数笔记

    a=[1,2,3,4]print(repr(a))print(type(repr(a)))for i in repr(a): print(i)#repr函数是将对象转换成string类型

  5. c++从txt中读取数据,数据并不是一行路径(实用)

    #include <iostream>#include <fstream>#include <string> using namespace std; //输出空行 ...

  6. 通过.net core源码看下Dictionary的实现

    https://blog.csdn.net/narlon/article/details/80755386     .net core的代码位置 https://github.com/dotnet/c ...

  7. yii2下的路由重写

    1.在config/main.php中添加配置信息 文件位置如图所示(图中展示的是backend下的config,也可以在fronted和common的config中添加) 配置的代码标准格式如下 ' ...

  8. my.宝石 --- --- ZC 收集

    1.         DT PT 头盔 太阳石 物理伤害+8     √     月亮石 物理防御+12     √ 武器 太阳石 物理伤害+8   √     舍利子 法术伤害+6         ...

  9. Vue.js-----轻量高效的MVVM框架(九、组件利用Props传递数据)

    #使用props传递数据 html:传递普通的字符串 <h3>#使用props传递数据</h3> <div id="dr01"> <div ...

  10. 转 RMAN-20005: target database name is ambiguous

    发生的这个错误的由于: 在RMAN CATALOG中,register了一个name叫test的数据库,后来这个库被我搞坏了.就重建了一个test的数据库,名称没有更改,又重新register到RMA ...