Microsoft SQL Server 存储过程


TRIGGER

DDL触发器:主要用于防止对数据库架构、视图、表、存储过程等进行的某些修改;DDL事件是指对数据库CREATE,ALTER,DROP审核及规范数据库操作,创建用来监视并响应该数据库或服务器实例中的活动的事件通知时,可以指定相应事件类型或事件组,数据库(DataBase)级别和服务器(Server)级别;

DML触发器:DML事件是指对表或视图的INSERT,UPDATE,DELETE更新级联操作等;

查看触发器

--查看服务器级别DDL触发器及事件:
select * from sys.server_triggers
select * from sys.server_trigger_events
--查看数据库级别DDL触发器及事件
SELECT * FROM sys.triggers
SELECT * FROM sys.trigger_events
--查看数据库中DML类型触发器信息
select * from sysobjects where xtype='TR'
SELECT * FROM sys.all_objects WHERE type='TR'
--查看触发器一般信息
EXECUTE SP_HELP TRI_NAME
--查看触发器代码信息
EXECUTE SP_HELPTEXT TRI_NAME

创建触发器

--创建服务器级别的DDL触发器
if exists(select * from sys.server_triggers where name='tri_ddl_db')
--删除服务器级别的触发器
drop trigger tri_ddl_db on all server
go
create trigger tri_ddl_db
on all server
for create_database,drop_database,alter_database
as
    declare @EventData xml
    set @EventData = EVENTDATA();
    -- 当触发器执行时,该函数会返回触发器的事件信息。
    select EVENTDATA();
    select '触发器tri_ddl_db禁止创建、修改、删除数据库操作'
    select  @EventData.value('(/EVENT_INSTANCE/EventType)[1]','nvarchar(max)') as EventType,    --事件类型
            @EventData.value('(/EVENT_INSTANCE/PostTime)[1]','nvarchar(max)') as PostTime,    --事件触发的时间
            @EventData.value('(/EVENT_INSTANCE/ServerName)[1]','nvarchar(max)') as ServerName,    --计算机名
            @EventData.value('(/EVENT_INSTANCE/DatabaseName)[1]','nvarchar(max)') as DatabaseName,    --数据库名
            @EventData.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') as CommandText    --操作命令文本
    rollback
go
--判断数据库级别的触发器是否存在
 AND name='tri_ddl_tab')
--删除数据库级别的触发器
DROP TRIGGER tri_ddl_tab ON DATABASE
GO
--创建DDL触发器
CREATE TRIGGER tri_ddl_tab
ON DATABASE
--指定触发器事件
FOR create_table,alter_table,drop_table
AS
    print 'DDL触发器已禁止对表进行操作'
    --对操作进行回滚
    rollback
GO
--创建触发器禁止更改表内容
CREATE TRIGGER TRI_DATABASENAME_TABLENAME
ON [DATABASENAME].[dbo].[TABLENAME]
FOR INSERT,UPDATE,DELETE
AS
    rollback
    print'更新数据不成功!'
GO
--触发器创建时系统自动创建Inserted和Delete2个表放在内存中触发器执行完成后表也会同时删除。
--Insert表:存放由执行insert或update语句要向表中插入的所有行
--Delete表:存放由执行delete或update语句要向表中删除的所有行
CREATE TRIGGER tri_test_t1
ON [dbo].[t1]
for insert,delete,update
AS
    begin
    --插入及更新数据
    SELECT * into aa FROM inserted
    --更新及删除数据
    SELECT * into bb from deleted
    end
Go

--raiserror函数
CREATE TRIGGER TRI_NAME
ON TABLE_NAME
FOR UPDATE
AS
    if update(id)
       begin
           ,)
           rollback
       end
GO
--利用instead of 替代触发器实现工资的自动计算。
create table salary_table
(
    id int identity primary key,
    salary money,
    ,),
    realsalary money
)
Go
create trigger salary_trig
on salary_table
instead of insert
as
,)
select @salary=salary,@percent=[percent]from inserted
-@percent))
go
,0.2)

修改触发器

ALTER TRIGGER TRI_NAME

启用或禁用触发器

--启用和禁用服务器级别DDL触发器:
enable trigger tri_ddl_db on all server;
disable trigger tri_ddl_db on all server; 
--启用和禁用数据库级别DDL触发器
enable trigger tri_ddl_view on database;
disable trigger tri_ddl_view on database; 

删除触发器

--删除服务器级别的DDL触发器
DROP TRIGGER tri_ddl_db ON ALL SERVER
--删除数据库级别的DDL触发器
DROP TRIGGER tri_ddl_tab ON DATABASE
GO
DROP TRIGGER TRI_NAME

存储过程

查看存储过程

--通过系统存储过程sp_helptext可显示规则、默认值、没有加密的存储过程,用户定义的函数、触发器或视图的文本。
exec sp_helptext pro_name
exec sp_depends pro_name
exec sp_help pro_name

2.2创建存储过程

--创建没有参数的存储过程
create procedure student_info
as
    select student.sno,sname,cname,grade
    from student,sc,course
    where student.sno=sc.sno
       and course.cno=sc.cno
go
--执行存储过程
exec student_info
--创建带有输入参数的存储过程
create procedure student_info2
),)
as
    select student.sno,sname,cname,grade
    from student,sc,course
    where student.sno=sc.sno
       and course.cno=sc.cno
       and sname=@xm
       and cname=@kcm
go
--存储过程调用形式
-- 按位置传送参数值
exec student_info2 '李明','高等数学'
--使用参数名传送
exec student_info2 @xm='李明',@kcm='高等数学'
exec student_info2 @kcm='高等数学',@xm='李明'
create procedure stud_info3
)='女'
as
    if (@startdate is null or @enddate is null
       or @sex is null)
       begin
           ,)
           return
       end
    select * from student
    where sbirth between @startdate and @enddate and ssex=@sex
    order by sbirth
go
exec stud_info3 '1991-1-1','1992-12-31'
--创建带有通配符参数的存储过程
if exists
    (select name from sysobjects
     where name='student_info3' and type='P')
     drop procedure student_info3
go
create procedure student_info3
)='刘%'
as
    select student.sno,sname,cname,grade
    from student join sc join course
    on course.cno=sc.cno
    on student.sno=sc.sno
    where sname like @xm
go
execute student_info3 '[王张]%'
--创建带有output参数的存储过程
if exists
    (select name from sysobjects
     where name='student_info4' and type='p')
     drop procedure student_info4
go
create procedure student_info4
),@pjf tinyint output
as
    select @pjf=AVG(grade)
    from student join sc
    on student.sno=sc.sno
    where sname=@xm
go
declare @pjf tinyint
exec student_info4 '邓立新',@pjf output
select '邓立新',@pjf
create procedure stud_info
@startdate date,@enddate date,
@recordcount int output
as
    if (@startdate is null or @enddate is null)
       begin
           ,)
           return
       end
    select *
    from student
    where sbirth between @startdate and @enddate
    order by sbirth
    select @recordcount=@@ROWCOUNT
Go
--其中,@@ROWCOUNT是SQL Server用来返回受上一语句影响的行数的系统变量,在这里用它来返回符合条件记录数。
declare @recordcount int
exec stud_info '1991-1-1','1992-12-31'
,@recordcount output
select @recordcount as '人数'
go
--使用with encryption选项对用户隐藏存储过程
create procedure encrypt_this
with encryption
as
    select * from student
Go
exec sp_helptext encrypt_this
--创建用户自己定义的存储过程
--创建一个过程,显示表名以xs开头的所有表及其索引。如果没有指定参数,此过程返回表名以kc开头的所有表及对应索引
create procedure sp_showtable
)='xs%'
as
    select sysobjects.name as table_name,
          sysindexes.name as index_name
          from sysindexes join sysobjects
          on sysindexes.id=sysobjects.id
          where sysobjects.name like @table
go
exec sp_showtable 'xs%'
go

2.3修改存储过程

--重命名存储过程
sp_rename old_procedure_name, new_procedure_name
ALTER PROCEDURE teacher_proc1
WITH RECOMPILE, ENCRYPTION
AS
   SELECT teacher_id,name,tech_title,telephone FROM teacher_info
   WHERE gender = '女'
GO
--在创建一个按照性别统计人数的存储过程stud_proc3,要求输入性别的值后,
--返回对应性别的学生人数,但需保证其在每次被执行时都被重编译处理。
create procedure stud_proc
(),@man_count int output)
with recompile
as
    select @man_count=COUNT(*)
    from student
    where ssex=@sex
go
declare @man_count int
exec stud_proc '女',@man_count output
select @man_count as '人数'
go

2.4删除存储过程

DROP PROCEDURE teacher_info_proc1

Microsoft SQL Server 存储过程的更多相关文章

  1. Microsoft SQL Server 存储过程举例

    -- if SP is existed, drop it. if (object_id('InvHoldToDPS', 'P') is not null) drop proc InvHoldToDPS ...

  2. sql: MySQL and Microsoft SQL Server Stored Procedures IN, OUT using csharp code

    MySQL存储过程: #插入一条返回值涂聚文注 DELIMITER $$ DROP PROCEDURE IF EXISTS `geovindu`.`proc_Insert_BookKindOut` $ ...

  3. SQL Server存储过程

    创建于2016-12-24 16:12:19 存储过程 概念: 1.存储过程是在数据库管理系统中保存的.预先编译的.能实现某种功能的SQL程序,它是数据库应用中运用比较广泛的 一种数据对象. 2.存储 ...

  4. 从 Microsoft SQL Server 迁移到 Oracle

    来源于:http://www.oracle.com/technetwork/cn/database/migration/sqlserver-095136-zhs.html Oracle SQL Dev ...

  5. 最有效地优化 Microsoft SQL Server 的性能

      为了最有效地优化 Microsoft SQL Server 的性能,您必须明确当情况不断变化时,性能将在哪些方面得到最大程度的改进,并集中分析这些方面.否则,在这些问题上您可能花费大量的时间和精力 ...

  6. Microsoft SQL Server 管理 (常用管理及维护命令)

    --查询当前连接的实例名 select @@servername --察看任何数据库属性 sp_helpdb master --设置单用户模式,同时立即断开所有用户 alter database No ...

  7. Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 1 -使用FOR XML返回XML结果集

    XML 介绍 <CustomersOrders> <Customer custid="1" companyname="Customer NRZBB&qu ...

  8. SQL Server——存储过程

    我想从下面几个方面大概的讲述下存储过程,可能有些知识点是你没有注意的,也可能有些知识点我不知道,欢迎大家指点指点.如有不足,欢迎指教! 存储过程概念 存储过程优点 存储过程的接口 存储过程的解析.编译 ...

  9. Amazon RDS 上的 Microsoft SQL Server » 导入和导出 SQL Server 数据库

    导入和导出 SQL Server 数据库 Amazon RDS 支持使用完整备份文件 (.bak 文件) 对 Microsoft SQL Server 数据库进行本机备份和还原.您可以在单个便携式文件 ...

随机推荐

  1. influxDB+telefraf+grafana

    此贴自己记录 下载grafana https://grafana.com/grafana/download?platform=windows 从官网下载influxDB\telefraf的方法 : h ...

  2. Android架构的简单探讨(一)

    在CSDN上看到这样一篇译文,虽然最终的解决方案要按照自己特定的项目去设计,但该文还是引起了很多自己的共鸣,原文猛戳这里. 这是他提出的基于Messaging的MVC框架: 其中包含的设计思想在于:哪 ...

  3. 关于mysql建立索引 复合索引 索引类型

    这两天有个非常强烈的感觉就是自己在一些特别的情况下还是hold不住,脑子easy放空或者说一下子不知道怎么去分析问题了,比方,问"hash和btree索引的差别",这非常难吗.仅仅 ...

  4. Noip模拟 Day6.13 By LD T1

    一.哲哲回家 出题人的解答: 可以将其转化成最短路模型. 这个地方转车怎么转移有点困难,有两种方法: 1.我们可以再把每一个点拆成M个点,我们用F[i,j]表示从1号点到i这个点并且坐在j路车上的最少 ...

  5. GuiLite 1.2 发布(希望通过这100+行代码来揭示:GuiLite的初始化,界面元素Layout,及消息映射的过程)

    经过开发群的长期验证,我们发现:即使代码只有5千多行,也不意味着能够轻松弄懂代码意图.痛定思痛,我们发现:虽然每个函数都很简单(平均长度约为30行),可以逐个击破:但各个函数之间如何协作,却很难说明清 ...

  6. C++ 代码片段(积累)

    1.MFC中点出对话框显示另存为的一个路径和文件: void CPatchDlg::OnBnClickedBtnPath() { //一下为选择另存为一个路径 m_strSavepath = &quo ...

  7. P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反)

    P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反) 并查集本来就是连一对不同父亲的节点就的话连通块就少一个. 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统 ...

  8. HDU 5073 数学题

    题目传送门 http://acm.hdu.edu.cn/showproblem.php?pid=5073 这道题RE了好多发啊囧,RE到精神不振. Galaxy的质心并不是一成不变的,随着一些星球的移 ...

  9. 使用WinSXS进行系统盘瘦身Windows 7/2008/10/2012不断变大的C盘(Windows 更新清理)

    这是一款非常给力的国产良心小工具,用阿里云ECS的时候,一个C盘没多久就被坑爹的微软更新沉余文件塞满.此工具简单好用一下搞定! 操作系统: 所有 NT 6.X 内核的操作系统.比如 Windows V ...

  10. ODP.NET Managed 相关文章收集

      一.Oracle 对.net支持的一些基础知识了解介绍. 1.早年的时候,微软自己做的有 System.Data.OracleClient. 现在已经成了过期类了.性能等都不是很好. 2.Orac ...