Sql Server-视图 存储过程 函数 触发器 索引

1.视图

[sql]  view plain copy
  1. 视图不是真实存在的基础表而是一个虚拟表,视图所对应的数据并不实际以视图结构存储在数据库中,而是存储在视图所引用的表中  
  2. 视图的分类  
  3.     标准视图:  
  4.     索引视图:  
  5.     分区视图:  
  6. 视图的作用  
  7.     集中数据,定制数据,合并分隔数据,安全机制  
  8. 视图最多1024列  
  9.   
  10. --创建视图    
  11. create view v_emp    
  12. as     
  13.     select * from d_emp    
  14. --删除视图    
  15. drop view v_emp    
  16. ----------------------------------------------------------------------  
  17. --对视图的操作  
  18. insert into v_dept values(1,'开发部')  
  19. insert into v_dept values(2,'财务部')  
  20. update v_dept set dept_name='人事部' where dept_id=2  
  21. delete from v_dept where dept_id=2  
2.存储过程

[sql]  view plain copy
  1. 存储过程是存放在服务器端数据库中的子程序  
  2. 存储过程在第一次执行时,进行语法检测和编译,执行后,他的执行计划就驻留在高速缓存中,用于后续调用  
  3. 存储过程的分类  
  4.     系统存储过程:由系统提供,存放在MASTER数据库中,前缀为SP  
  5.     用户存储过程:由用户创建  
  6. 系统存储过程主要包含  
  7.     目录存储过程  
  8.     复制类存储过程  
  9.     安全管理类存储过程  
  10.     分布式查询存储过程  
  11. 自定义的存储过程,应避免使用SP_为前缀.  
  12. 因为接收到SP_开头的存储过程,SQL SERVER 首先会在 MASTER 数据库中寻找存储过程,这会影响执行效率  
  13. 存储过程最多可以有2100个参数,最大为128MB  
  14.   
  15. --不带参数的存储过程  
  16. create proc p_dept  
  17. as  
  18. select * from d_dept  
  19. ----------------------------------------------------------------------  
  20. --输入参数的存储过程  
  21. create proc p_dept  
  22.     @dept_id int  
  23. as  
  24.     select * from d_dept where dept_id=@dept_id  
  25. ----------------------------------------------------------------------  
  26. --输出参数的存储过程  
  27. create proc p_dept  
  28.     @dept_id int,  
  29.     @dept_name varchar(50) output  
  30. as  
  31.     select @dept_name=dept_name from d_dept where dept_id=@dept_id  
  32. ----------------------------------------------------------------------  
  33. --输入输出合体使用  
  34. create proc p_result  
  35.     @dept_id int  
  36. as  
  37.     declare @emp_name varchar(50)  
  38.     exec p_dept @dept_id,@emp_name output  
  39.     select @emp_name  
  40. ----------------------------------------------------------------------  
  41. --执行存储过程  
  42. execute p_result 1  

3.函数

[sql]  view plain copy
  1. 函数是由一个或者多个T-SQL语句组成的子程序,用于封装代码便于重新使用  
  2. 自定义函数只能返回单一值或者表  
  3. 函数不能对基表进行DML语句  
  4. 根据函数返回类型不同,将用户自定义的函数分为三种类型  
  5.     标量函数:函数返回一个确定类型的标量值  
  6.     内联表函数:以表的形式返回一个返回值  
  7.     多语句表值函数:标量函数和内联表函数的结合体  
  8. ----------------------------------------------------------------------  
  9. --增加标量函数  
  10. create function fn_getDeptName(@dept_id int)  
  11.     returns varchar(50)  
  12. as  
  13. begin  
  14.     declare @dept_name varchar(50)  
  15.     select @dept_name=dept_name from d_dept where dept_id=@dept_id  
  16.     return @dept_name  
  17. end  
  18. --执行标量函数  
  19. select dbo.fn_getDeptName(1)  
  20. --删除标量函数  
  21. drop function fn_getDeptName  
  22. ----------------------------------------------------------------------  
  23. --增加内联表函数  
  24. create function if_d_dept(@dept_id int)  
  25.     returns @temp table(id int,name varchar(50))  
  26. as  
  27. begin  
  28.     insert into @temp  
  29.     select dept_id,dept_name from d_dept where dept_id=@dept_id  
  30.  return  
  31. end  
  32. --执行内联表函数  
  33. select * from if_d_dept(1)  
  34. --删除内联表函数  
  35. drop function if_d_dept  
  36. ----------------------------------------------------------------------  
  37. --增加多语句表值函数  
  38. create function fnif_d_dept(@dept_name varchar(50))  
  39.     returns @temp table(id int,name varchar(50))  
  40. as  
  41. begin  
  42.     --函数中使用临时表  
  43.     declare @result table(id int,name varchar(50))  
  44.     insert into @result  
  45.     select dept_id,dept_name from d_dept where dept_name=@dept_name  
  46.   
  47.     insert into @temp  
  48.     select * from @result  
  49.  return  
  50. end  
  51. --执行多语句表值函数  
  52. select * from fnif_d_dept('开发部')  
  53. --删除多语句表值函数  
  54. drop function fnif_d_dept  

4.触发器

[sql]  view plain copy
  1. 触发器是一种与数据表紧密关联的特殊存储过程  
  2. 当数据表进行 insert delete update 事件发生时,所设置的触发器就会自动执行,保持数据库的完整性  
  3. 触发器在数据库以独立的对象存储(存储过程通过其他程序启动),触发器不能直接调用,只能通过事件来启动  
  4. 触发器不能传递或者接收参数  
  5.   
  6. 触发器的类型  
  7.     DML触发器:在数据库数据发生操作语言(DML)事件时将调用 DML 触发器  
  8.         after 触发器:在执行了 insert delete update 语句之后,after 触发器才会被激发  
  9.             用于对变动数据进行检查,如果错误,将拒绝后者回滚  
  10.             after 触发器只能在表上指定  
  11.             每个触发操作可以包含多个触发器  
  12.             插入和删除表中的 text,ntext,image 列引用,不能使用  
  13.         instead of 触发器:数据变动之前被激活,转而去执行触发器定义的操作,并不再执行原来SQL操作  
  14.             instead of 触发器可以指定在视图和表上  
  15.             每个触发操作只能包含一个触发器   
  16.               
  17.     DDL触发器(2005):当服务器或者数据库发生数据定义语言(DDL)事件,将调用触发器  
  18.         DLL触发器主要有,数据库作用域和服务器作用域  
  19.         DLL触发器用来管理任务,例如审核和控制数据库操作  
  20.   
  21. 触发器的作用  
  22.     DML触发器可以实现级联更改,保证数据的完整性  
  23.   
  24. 触发器两个特殊虚表  
  25.     inserted和deleted表,系统在内存中创建两张表,不存储在数据库中,两张表是只读的  
  26.     这两表被触发的表结构相同,当触发完成之后两张表被删除  
  27.     inserted 表存放增加的记录和存放更新后的记录  
  28.     deleted 表存放被删除的记录和存放更新之前的记录  
  29.   
  30. 测试特定列的 update 操作  
  31.     update 对某一个列的 update  
  32.     columns_update 对多个列的 update  
  33.     返回一个布尔值  
  34.   
  35. 嵌套触发器  
  36.     当某一个触发器执行,能够触发另外一个触发器执行,这种情况称为嵌套触发器  
  37.     如果一个触发器修改一张表,而这张表已经有了其他触发器,这时就使用了嵌套触发器  
  38.     由于触发器在事务中执行,如果在一组嵌套触发器的任意层发生错误,则整个事务将被取消,回滚  
  39.     触发器最多嵌套32级  
  40.   
  41. 递归触发器  
  42.     直接递归:  
  43.         默认情况SQL server是禁止 after 触发器的直接递归  
  44.         如果需要开启,sp_dboption 'itlwc','recursive_triggers',true  
  45.     间接递归  
  46.   
  47. 触发器的激发顺序  
  48.     execute sp_settriggerorder 'tigger_curd1','first','insert'  
  49.     execute sp_settriggerorder 'tigger_curd2','last','insert'  
  50.   
  51. --创建 after 触发器  
  52.     create table d_dept(  
  53.         dept_id int,  
  54.         dept_name varchar(20)  
  55.         constraint pk_d_dept primary key (dept_id)  
  56.     )  
  57.     create table d_deptBackup(  
  58.         operate varchar(20),  
  59.         operateTime smalldatetime,  
  60.         dept_id int,  
  61.         dept_name varchar(20)  
  62.     )  
  63.     --判断是否存在  
  64.     if(object_id('tigger_curd','tr'is not null)  
  65.         drop trigger tigger_curd  
  66.     go  
  67.     create trigger tigger_curd  
  68.     on d_dept  
  69.         after insert,delete,update  
  70.     as  
  71.         insert into d_deptBackup  
  72.         select '插入数据',getDate(),dept_id,dept_name from inserted  
  73.         insert into d_deptBackup  
  74.         select '删除数据',getDate(),dept_id,dept_name from deleted  
  75.   
  76. --创建 after delete 触发器  
  77.     if(object_id('tigger_curd','tr'is not null)  
  78.         drop trigger tigger_curd  
  79.     go  
  80.     create trigger tigger_curd  
  81.     on d_dept  
  82.         after delete  
  83.     as  
  84.         declare @rowcount int  
  85.         select @rowcount=@@rowcount --当前删除操作影响的记录数        
  86.         if @rowcount>1  
  87.             begin  
  88.                 rollback transaction    --回滚取消操作  
  89.                 raiserror('一次只能删除一条记录',16,1)    --给出错误信息  
  90.             end  
  91.         declare @dept_name varchar(20)  
  92.         set @dept_name = '开发部'  
  93.         if(@dept_name in (select dept_name from deleted))  
  94.         begin  
  95.             rollback transaction    --回滚取消操作  
  96.             raiserror('不能删除 开发部 ',16,1) --给出错误信息  
  97.         end  
  98.   
  99. --使用 update()  
  100.     if(object_id('tigger_curd','tr'is not null)  
  101.         drop trigger tigger_curd  
  102.     go  
  103.     create trigger tigger_curd  
  104.     on d_dept  
  105.         after update  
  106.     as  
  107.         if(update(dept_id) or update(dept_name))  
  108.             begin  
  109.                 rollback transaction    --回滚取消操作  
  110.                 raiserror('不允许更新该列信息',16,1) --给出错误信息  
  111.             end  
  112.   
  113. --创建 instead of 触发器  
  114.     create table emp2005(  
  115.         emp_id varchar(10),  
  116.         emp_name varchar(10)  
  117.     )  
  118.     create table emp2006(  
  119.         emp_id varchar(10),  
  120.         emp_name varchar(10)  
  121.     )  
  122.     create table emp2007(  
  123.         emp_id varchar(10),  
  124.         emp_name varchar(10)  
  125.     )  
  126.     create view v_emp  
  127.     as  
  128.         select * from emp2005  
  129.         union all  
  130.         select * from emp2006  
  131.         union all     
  132.         select * from emp2007  
  133.               
  134.     if(object_id('tigger_curd','tr'is not null)  
  135.         drop trigger tigger_curd  
  136.     go  
  137.     create trigger tigger_curd  
  138.     on v_emp  
  139.         instead of insert  
  140.     as  
  141.         declare @emp_id char(4)  
  142.         select @emp_id = substring(emp_id,1,4) from inserted  
  143.         if @emp_id ='2005'  
  144.             begin  
  145.                 insert into emp2005  
  146.                 select * from inserted  
  147.             end  
  148.         else if @emp_id ='2006'  
  149.             begin  
  150.                 insert into emp2006  
  151.                 select * from inserted  
  152.             end  
  153.         else if @emp_id ='2007'  
  154.             begin  
  155.                 insert into emp2007  
  156.                 select * from inserted  
  157.             end  
  158.         else  
  159.             begin  
  160.                 rollback transaction    --回滚取消操作  
  161.                 raiserror('插入记录emp_id不正确',16,1) --给出错误信息  
  162.             end  
  163.   
  164. --创建 递归触发器  
  165.     insert into d_dept values(1001,'开发部')  
  166.     insert into d_dept values(1002,'开发部')  
  167.     insert into d_dept values(1003,'开发部')  
  168.     insert into d_dept values(1004,'开发部')  
  169.     insert into d_dept values(2001,'开发部')  
  170.     insert into d_dept values(2002,'开发部')  
  171.     insert into d_dept values(3001,'开发部')  
  172.   
  173.     if(object_id('tigger_curd','tr'is not null)  
  174.         drop trigger tigger_curd  
  175.     go  
  176.     --删除本身并且删除前一个和后一个  
  177.     create trigger tigger_curd  
  178.     on d_dept  
  179.         after delete  
  180.     as  
  181.         declare @rowcount int  
  182.         set @rowcount = @@rowcount  
  183.         if @rowcount=1  
  184.             begin  
  185.                 declare @up_dept_id int  
  186.                 declare @down_dept_id int  
  187.                 select @up_dept_id=dept_id,@down_dept_id=dept_id from deleted  
  188.                 set @up_dept_id=@up_dept_id-1  
  189.                 set @down_dept_id=@down_dept_id+1  
  190.                 delete from d_dept where dept_id=@up_dept_id  
  191.                 delete from d_dept where dept_id=@down_dept_id  
  192.             end  
  193.     --测试:最后只剩下 2001,2002,3001  
  194.     delete from d_dept where dept_id=1002  
5.索引

[sql]  view plain copy
  1. 知识点    
  2.     索引是对数据库表中一个或多个列的值进行排序的结构  
  3.     建立索引目的是对表中记录的查询或者排序  
  4.     当表中有别设置为 unique 的字段时,sql server 会自动建立一个非聚集的唯一性索引    
  5.     当表中有 primary key 的字段时,sql server 会自动建立一个聚集索引  
  6.   
  7. 索引的作用    
  8.     索引相当与书的目录,无需对数据库进行整体扫描,加快数据检索速度    
  9.     通过唯一索引,可以保证数据的唯一性    
  10.     可以加速表与表之间的连接    
  11.     在使用 order by 和 group by 子句进行检索数据,显著减少查询中排序和分组的时间    
  12.     使用索引可以在检索数据的过程中使用优化隐藏器,提过系统的性能    
  13.     
  14. 使用索引  
  15.     查询表中所有数据,使用索引是没有意义的    
  16.     索引列应该在 where 子句中频繁使用的列  
  17.     当用户要检索字段的数据包含很多数值或者很多控制 NULL 时,为该列创建索引会大大提高速度  
  18.     经常排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序速度  
  19.     索引占用数据库空间,在设计数据库应该把索引空间考虑进去  
  20.     尽量把表和他的索引存在不同的磁盘上,这样会提高查询速度  
  21.     不给数据较少和数据较大但不经常查询的表建立索引    
  22.     多表连接查询的时候,最好能够为关联字段建立索引    
  23.     当表数据以查询为主导,更新相对少,则要多采用索引,增加检索速度    
  24.     当表数据更新为主导,查询相对少,则不要建立太多的索引,避免影响更新的速度  
  25.     如果对表进行大量更新时,可以先销毁索引,等数据更新完成之后再创建索引    
  26.     要在表的更新速度与查询速度之间寻求一个平衡点  
  27.       
  28. 索引分类  
  29.     聚集索引:  
  30.         是按照数据存放的物理位置为顺序的  
  31.         也就是说改变了表中数据存放的物理位置  
  32.         对于多行检索的检索很快  
  33.         在插入新行或者更新聚集索引一部分列时,DBMS将自动重新排序  
  34.     非聚集索引:  
  35.         独立于数据行的结构  
  36.         非聚集索引包含键值和行定位器  
  37.         对于单行的检索很快  
  38.         一个表中可以创建多个非聚集索引,SQL Server 查询优化器会自动决定使用哪个索引  
  39.     
  40. --创建简单索引    
  41. create index index_d_dept    
  42. on d_dept(dept_name)    
  43. --创建唯一索引    
  44. create unique index index_d_dept    
  45. on d_dept(dept_name)    
  46. --创建多列索引    
  47. create unique index index_d_dept    
  48. on d_dept(dept_id,dept_name)    
  49. --删除索引    
  50. drop index d_dept.index_d_dept   
  51. --禁用索引(2005)  
  52. alter index index_d_dept  
  53. on d_dept disable  
  54. --启用索引(2005)  
  55. alter index index_d_dept  
  56. on d_dept rebuild  
  57. --重命名索引  
  58. execute sp_rename 'd_dept.index_d_dept','d_dept.index_d_dept_new','index'  
  59. --查看表中的索引  
  60. execute sp_helpindex 'd_dept'  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值