閱讀1008 返回首頁    go 阿裏雲 go 技術社區[雲棲]


SQL Server---觸發器

        今天第一次使用SQL Server中的觸發器感覺很方便,本文將簡單的向大家介紹一下SQL Server中的觸發器以及其簡單的使用。我會從其定義、原理、具體的用法分別大家講述。

        定義

        觸發器(trigger)是個特殊的存儲過程,它的執行不是由程序調用,也不是手工啟動,而是由某個事件來觸發,比如當對一個表進行操作(insert,delete,update)時就會激活它執行。

        原理

        觸發器可以查詢其他表,而且可以包含複雜的SQL語句。觸發器也可用於強製引用完整性,以便在多個表中添加、更新或刪除行時,保留在這些表之間所定義的關係。

        SQLServer包括三種常規類型的觸發器:DML觸發器、DDL觸發器和登錄觸發器。

        DML觸發器

        當數據庫中表中的數據發生變化時,包括insert,update,delete任意操作,如果我們對該表寫了對應的DML觸發器,那麼該觸發器自動執行。

        DDL觸發器

        它是SqlServer2005新增的觸發器,主要用於審核與規範對數據庫中表,觸發器,視圖等結構上的操作。

        登錄觸發器

        登錄觸發器將為響應LOGON事件而激發存儲過程。

        具體用法

        再敲機房收費係統的時候,在涉及到學生上下機的時候,我們就要對T_Line和T_Online這兩張表進行操作,下機的時候我們需要刪除T_Online表中的信息將它寫入T_Line中。采用三層架構重構時,頓時覺得從一個表中得到數據返回U層再將其賦值給另一個實體當作參數最終傳入另一張表中很是麻煩。於是我就想到了觸發器。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<老牛>
-- Create date: <2014-6-2 15:28:00>
-- Description:	<刪除正在上機的學生時同時將相關信
--                息添加到學生上機記錄表中>
-- =============================================
CREATE TRIGGER [dbo].[triq_T_OnlineDelete]
   ON  [dbo].[T_Online] 
   instead of Insert
AS 
BEGIN
	declare @CardNo numeric(11, 0)
	declare @studentNo  numeric(11, 0)
	declare @studentName varchar(10)

	--獲取參數信息
	select @CardNo=cardNo,@studentNo=studentNo ,@studentName=studentName from deleted 
	--添加學生上機記錄
	insert into T_Line (cardNo,studentNo ,studentName ) values (@CardNo,@studentNo,@studentName)
	--刪除正在上機的學生信息
	delete T_Online where cardNo =@CardNo
END
GO

(PS:上段代碼(經測試正確)隻用到了表中的幾個字段其他字段也可用類似方法,特別要注意的是怎樣獲取下機時間(hh-mm-ss)和下機日期(yyyy-mm-dd),例如:Select CONVERT(varchar(100),GETDATE(), 24;Select CONVERT (varchar(10),getdate(),120)

心得體會

        寫到這裏又想起了那句話“不將就是發現的原動力”,我們學習過程中也用到SQL Server一段時間了,之前我們也接觸到了很多理論上的東西總感覺很高深的樣子,總想著我會簡單的增刪改查就能解決目前的問題了。隻有我們不再將就的時候我們學習了新的技術,才會感覺到,原來也就這麼回事。


最後更新:2017-04-03 08:26:22

  上一篇:go Java的LockSupport.park()實現分析
  下一篇:go c#-string 字符串相關