日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Microsoft SQL Server 存储过程

發布時間:2024/1/17 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Microsoft SQL Server 存储过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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 asdeclare @EventData xmlset @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 --判斷數據庫級別的觸發器是否存在 IF EXISTS(SELECT * FROM sys.triggers WHERE parent_class = 0 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 ASrollbackprint'更新數據不成功!' GO --觸發器創建時系統自動創建Inserted和Delete2個表放在內存中觸發器執行完成后表也會同時刪除。 --Insert表:存放由執行insert或update語句要向表中插入的所有行 --Delete表:存放由執行delete或update語句要向表中刪除的所有行
CREATE TRIGGER tri_test_t1 ON [dbo].[t1] for insert,delete,update ASbegin--插入及更新數據SELECT * into aa FROM inserted--更新及刪除數據SELECT * into bb from deletedend Go --raiserror函數 CREATE TRIGGER TRI_NAME ON TABLE_NAME FOR UPDATE ASif update(id)beginraiserror('不能修改!',10,1)rollbackend GO --利用instead of 替代觸發器實現工資的自動計算。 create table salary_table (id int identity primary key,salary money,[percent] numeric(2,1),realsalary money ) Go create trigger salary_trig on salary_table instead of insert as declare @salary money,@percent numeric(2,1) select @salary=salary,@percent=[percent]from inserted insert into salary_table(salary,[percent],realsalary) values(@salary,@percent,@salary*(1-@percent)) go insert into salary_table(salary,[percent]) values(1500,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 asselect student.sno,sname,cname,gradefrom student,sc,coursewhere student.sno=sc.snoand course.cno=sc.cno go --執行存儲過程 exec student_info --創建帶有輸入參數的存儲過程 create procedure student_info2 @xm varchar(8),@kcm varchar(50) asselect student.sno,sname,cname,gradefrom student,sc,coursewhere student.sno=sc.snoand course.cno=sc.cnoand sname=@xmand cname=@kcm go --存儲過程調用形式 -- 按位置傳送參數值 exec student_info2 '李明','高等數學' --使用參數名傳送 exec student_info2 @xm='李明',@kcm='高等數學' exec student_info2 @kcm='高等數學',@xm='李明' create procedure stud_info3 @startdate date,@enddate date,@sex char(2)='' asif (@startdate is null or @enddate is nullor @sex is null)beginraiserror('null value are invalid',5,5)returnendselect * from studentwhere sbirth between @startdate and @enddate and ssex=@sexorder by sbirth go exec stud_info3 '1991-1-1','1992-12-31' --創建帶有通配符參數的存儲過程 if exists(select name from sysobjectswhere name='student_info3' and type='P')drop procedure student_info3 go create procedure student_info3 @xm varchar(8)='劉%' asselect student.sno,sname,cname,gradefrom student join sc join courseon course.cno=sc.cnoon student.sno=sc.snowhere sname like @xm go execute student_info3 '[王張]%' --創建帶有output參數的存儲過程 if exists(select name from sysobjectswhere name='student_info4' and type='p')drop procedure student_info4 go create procedure student_info4 @xm varchar(8),@pjf tinyint output asselect @pjf=AVG(grade)from student join scon student.sno=sc.snowhere sname=@xm go declare @pjf tinyint exec student_info4 '鄧立新',@pjf output select '鄧立新',@pjf create procedure stud_info @startdate date,@enddate date, @recordcount int output asif (@startdate is null or @enddate is null)beginraiserror('null value are invalid',5,5)returnendselect *from studentwhere sbirth between @startdate and @enddateorder by sbirthselect @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 asselect * from student Go exec sp_helptext encrypt_this --創建用戶自己定義的存儲過程 --創建一個過程,顯示表名以xs開頭的所有表及其索引。如果沒有指定參數,此過程返回表名以kc開頭的所有表及對應索引 create procedure sp_showtable @table varchar(30)='xs%' asselect sysobjects.name as table_name,sysindexes.name as index_namefrom sysindexes join sysobjectson sysindexes.id=sysobjects.idwhere 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 ASSELECT teacher_id,name,tech_title,telephone FROM teacher_infoWHERE gender = '' GO --在創建一個按照性別統計人數的存儲過程stud_proc3,要求輸入性別的值后, --返回對應性別的學生人數,但需保證其在每次被執行時都被重編譯處理。 create procedure stud_proc (@sex char(2),@man_count int output) with recompile asselect @man_count=COUNT(*)from studentwhere 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

?

?

?

轉載于:https://www.cnblogs.com/Aha-Best/p/10870119.html

總結

以上是生活随笔為你收集整理的Microsoft SQL Server 存储过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。