程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> sqlserver 觸發器教程

sqlserver 觸發器教程

編輯:MSSQL

sqlserver 觸發器教程。本站提示廣大學習愛好者:(sqlserver 觸發器教程)文章只能為提供參考,不一定能成為您想要的結果。以下是sqlserver 觸發器教程正文


點擊查看原圖

關於z-index,今朝碰到的一些成績

1. 某些閱讀器下元素層級隱瞞存在bug;

2. 某個元素z-index設的太年夜,招致一直沒法被隱瞞;

3. js靜態盤算z-index,招致元素籠罩關系部可控

 

層級隱瞞bug湧現的緣由:

IE6/7對z-index的表示跟IE8及以上閱讀器紛歧致。position值為非static時,假如不設置z-index屬性,IE6/7下z-index默許為0,而IE8及以上閱讀器z-index為auto,且zindex:auto的元素不介入堆疊優先級比擬。

ff/chrome z-index IE6/7 IE8/9 不設置 0 auto auto number number number number

 層級關系的比擬:

先看幾點結論:

1. 關於同級元素,默許(或position:static)情形下文檔流前面的元素會籠罩後面的;

2. 關於同級元素,position不為static且z-index存在的情形下z-index年夜的元素會籠罩z-index小的元素,即z-index越年夜優先級越高;

3. IE6/7下position不為static,且z-index不存在時z-index為0,除此以外的閱讀器z-index為auto

4. z-index為auto的元素不介入層級關系的比擬,由向上遍歷至此且z-index不為auto的元從來介入比擬。

在下面2點結論的基本上,我們引入“定位樹”(非w3c官方辭匯)的概念來做層級的比擬。

在定位樹這個概念下,閱讀器在襯著dom節點時,除生成dom樹以外,還會依據dom樹中的定位元素(position不為static)生成“定位樹”:
dom樹、定位樹比較以下(個中邊上有白色圓圈的表現該元素position不為static):


可以如許懂得:定位樹中包括了dom樹中position不為staitc的全體元素。非同級元素比擬層級關系可以如許比擬:

1. 向上遍歷定位樹的父節點直到2個元素為同級元素。

2. 依據下面的結論來最最初的比擬。層級高的元素會越接近用戶的顯示器並能籠罩層級低的元素。

 

實例一:假定上圖中一切標白色元素position都不為static;且z-index=1,依據下面的比擬規矩可以曉得:

1. c > (b && b *) > (a && a *) 即元素c及c的一切定位元素層級比a、b高

2. m > h、 g > k、d > m

實例二:假定a的position不為static,z-index屬性不存在,定位樹中a的子元素z-index一次分離為1,2,3,4...其它定位元素z-index:1:

1. 依據結論三有:IE6/7下 b > (a && a *) 即元素b的層級比a及a的一切定位元素層級高,其它閱讀器下:i > h > b > d


2. 界說觸發器接收傳遞過去的Delete語句,然後依據這個語句來履行代碼。
3. 尺度SQL刪除代碼以下:
DELETE From Navtion_TopSubject Where fYopID = 'aaa' (假定要刪除的主種別是消息,主鍵編號是aaa)
4. 如許我們便可以應用這個aaa來查找次種別表和內容表能否有所屬的內容。
5. 應用deleted表,這個表是邏輯刪除表,相���於Windows體系外面的收受接管站。Sql Server體系界說:假如一個內外面有觸發器,那末任何操作都不直接停止,而是停止邏輯操作。這個操作在Inserted表(拔出),Updated表(更新),Deleted表(刪除)中停止。就拿Deleted表來講,傳遞到Sql Server體系中的Del敕令,假如有觸發器的話,Sql起首復制這個要刪除的記載到Deleted表中(這個表是個暫時表,只能給觸發器用,觸發器運轉停止後主動刪除),我們便可以用此代碼:
Select fTopID From deleted
取得傳遞到Sql的表Navtion_TopSubject中記載為aaa的主鍵內容。
6. 把這個主鍵內容寄存到變量中,依據這個變量找次種別表,假如沒有內容,表現此記載沒有任何次種別和文章,可以直接刪除。
7. 假如次種別表中有內容,那末再用這個變量找內容表中屬於aaa的內容,假如有,就刪除,再刪除次種別表的內容,假如沒有,則直接刪除次種別表的內容。
8. 當次種別表和內容表的記載全體刪除清潔後,刪除主種別表的內容。
4、流程界說
先查找子種別的數目,賦值給@NodeCount變量,然後斷定
假如>0
則依據@fTopID找tText表的內容賦值給@fTextCount,假如>0則
起首刪除tText表相符@fTopID內容的一切記載
然後刪除子種別表Navtion_NodeSubject表中相符@fTopID的一切內容
最初刪除主種別表Navtion_TopSubject中相符@fTopID的一切內容
不然
起首刪除Navtion_NodeSubject子種別表中相符@fTopID的一切內容
然後刪除主種別表Navtion_TopSubject中相符@fTopID的一切內容
不然
僅刪除主種別表Navtion_TopSubject中相符@fTopID的一切內容
5、代碼說明
CREATE TRIGGER [RemoveTopAndNodeText] ON [dbo].[Navtion_TopSubject]
INSTEAD OF DELETE
AS
下面的代碼是樹立觸發器的Sql語句,內容:
CREATE TRIGGER T-SQL症結字,表現是一個觸���器
[RemoveTopAndNodeText] 是觸發器的稱號
[dbo].[Navtion_TopSubject] 表現這個觸發器屬於的表的稱號
INSTEAD OF 表現這個觸發器將屏障傳遞出去的Sql敕令,轉向履行觸發器的敕令
(多說一句:除INSTEAD OF症結字,還有 For症結字,表現這個觸發器在履行完傳遞出去的Sql語句後履行觸發器內容,普通用在Insert和Update中)
DELETE : 表現此觸發器的觸發前提是Delete敕令,假如對這個表作刪除操作,將履行這個觸發器的代碼。
As 表現上面的代碼是觸發器的代碼:
-------------------------------------------------------------------
/* 界說觸發器應用的變量 */
DECLARE
@fTopID Char,
@fNodeCount Int,
@fTextCount Int,
@fTopName VarChar
以上敕令是界說觸發器應用的變量,DECLARE 敕令相當於VBScript的Dim敕令,不外這個語句可以界說多變量,不消一個變量一個敕令,變量之間用英文逗號分隔。
@fTopID 是變量名,SqlServer劃定,在SqlServer中應用的變量名後面必需參加@字符。
變量前面是變量類型 Char是固定長度的字符串,Int是整數數字類型,VarChar是可變長度的字符串。
--------------------------------------------------------------------------
/* 把傳送的須要刪除的fTopID鍵值賦值給@fTopID變量 */
/* 開端事務 */
BEGIN TRAN Remove_TopSubject
Set @fTopID = (Select fTopID From deleted)

/* 保留刪除前保留點,避免失足 */
Save Tran my_Save1
以上代碼說明:
放在 /* 和 */之間的是法式正文,相似於Html外面的<!-- 和-->
BEGIN TRAN Remove_TopSubject 表現開端事務,個中RemoveTopSubject是事務稱號。
事務就是包管操作勝利的一種機制,假如在事務外面失足,那末事務將回滾,不會影響全部體系。
舉個例子,假如在事務外面界說了3個操作a b c,分離是a 拔出一筆記錄,b 刪除��筆記錄,c 更新一筆記錄。法式開端履行,假如a 履行勝利後開端操作b,b操作湧現毛病,那末事務開端回滾,拔出記載的a將會撤消,前往到沒有履行這3個操作之前的狀況。
Set @fTopID = (Select fTopID From deleted)
這個是Sql Server的賦值敕令,把變量@fTopID的值保留成deleted表中fTopID字段的內容。
Set @fTopName = (Select fTopName From deleted)
異樣的賦值敕令,把要刪除的主種別的稱號賦值給@fTopName變量,在前面的失足語句用。
Save Tran my_Save1
Save Tran表現保留事務,假如產生毛病,則可以用這個保留來恢復。相似於游戲外面的存盤文件。my_Save1是保留名,相當於存盤文件名。
接上:
Set @fNodeCount = (Select Count(*) From Navtion_NodeSubject Where Navtion_NodeSubject.fTopID = @fTopID)
也是一個變量賦值語句,設定@fNodeCount變量保留的是要刪除的主表記載(@fTopID變量的內容)所屬的次種別表Navtion_NodeSubject中的記載的數目
依據主表記載查找其他表相符前提的這個語句可參考這個帖子:
http://www.dw-mx.com/forum/mb_forum/detail2.asp?f2_id=37&f3_id=9022&f3_name=笑望人生
--------------------------------------------------------------------
If @fNodeCount > 0(作個標志,一級斷定)
開端斷定,假如@fNodeCount年夜於0,表現欲刪除的主種別記載包括有子種別,不克不及直接刪除,必需先刪除子種別。
但刪除子種別必需刪除子種別下包括的一切內容(文章)記載,所以我們必需斷定能否有內容記載
-----------------------------------------------------------------
Begin (作個標志,一級Begin)
表現If上面履行的多條語句,不懂的可以參考沒人道的FAQ帖子
--------------------------------------------------------------
Set @fTextCount = (Select Count(*) From tText Where tText.fTopID = @fTopID)
下面代碼持續賦值���@TextCount表現欲刪除的主種別記載所包括的一切的內容(文章)記載的數目
------------------------------------------
If @fTextCount > 0(標志,二級斷定)
斷定記載的數目,年夜於0表現有記載,如許必需先刪除內容表的記載,再刪除子種別表的記載,最初刪除主種別表的記載,如許才不會失足。
Begin (標志 ,二級Beging 一)
---------------------------------------------------
Delete From tText Where tText.fTopID = @fTopID
Delete From Navtion_NodeSubject Where fTopID = @fTopID
Delete From Navtion_TopSubject Where fTopID = @fTopID
End(標志,二級Begin一的停止敕令)
下面的語句很簡略,起首刪除tText表中fTopID相符@fTopID的記載(刪除內容表)
然後刪除Navtion_NodeSubject表相符@fTopID的記載(刪除次種別表)
最初刪除Navtion_TopSubject表相符@fTopID的記載(刪除主種別表)
----------------------------------------------------
Else (標志,二級斷定不然,表現@fTextCount=0,指內容表沒有記載)
--------------------------------------------------------
Begin (標志,二級Begin二)
Delete From Navtion_NodeSubject Where fTopID = @fTopID
Delete From Navtion_TopSubject Where fTopID = @fTopID
End (標志,二級Begin二停止)
以上代碼簡略,tText表(內容表)沒有記載,那末起首刪除次種別表Navtion_NodeSubject中的記載,再刪除主種別表Navtion_TopSubject中的記載。
------------------------------------
End (標志,二級Begin停止)
-------------------------------------
Else (標志:一級斷定不然,表現次種別表沒有內容@fNodeCount=0)
-------------------------------------------------------------
Begin
Delete From Navtion_TopSubject Where fTopID = @fTopID
End
下面代碼直接刪除主種別表Navtion_TopSubject的記載
-----------------------------------------------------
原來這個觸發器曾經停止,然則我們必需避免履行失足。所以假如失足,那末要回滾一切操作,而且向運用法式發送毛病信息。

If @@Error = 0
斷定,能否湧現毛病
@@Error是Sql Server的一個全局變量,保留上一個Sql敕令能否失足,假如失足,@@Error=1
假如是0,表現沒有失足。
-------------------------------------------
Commit Transaction
下面是沒有失足的語句,表現事務提交,(可以看做是停止事務)
假如後面有了Begin Tran開端事務的代碼,必需在前面加上這個代碼,不然事務不停止,數據庫記載將被鎖定,沒法對數據庫記載停止操作!
--------------------------------------------
Else
@@Error變量年夜於0,表現湧現毛病
----------------------------------
Begin
Rollback Transaction my_Save1
Raiserror('刪除湧現毛病,記載:%s及其所屬內容沒有被刪除。',16,1,@fTopName)
End

下面的代碼是個語句塊,表現假如下面的刪除語句失足後怎樣辦
Rollback Transaction my_Save1
Rollback Transaction 是Sql Server的外部敕令,表現回滾事務,就是之前的操作全體撤消。my_Save1是下面保留的保留點的稱號。
這個代碼意思和玩游戲中沒有過關,從存盤文件中恢復的事理一樣。 :D
----------------------------------------------------------------------
Raiserror('刪除湧現毛病,記載:%s及其所屬內容沒有被刪除。',16,1,@fTopName)
Raiserror表現自界說毛病信息,這個語句的感化是向應用Sql Server的運用法式發送信息。
如asp的代碼,asp代碼取得這個信息將顯示在網頁上。
16,1是毛病的品級號碼,這個我不做過量說明,有興致的人可以檢查SQL Server聯機叢書的
T-SQL說話參考。
%s是Reiserror敕令的自界說變量 %s表現字符串變量,內容是前面的@fTopName的內容。
這個語句相似於以下VBScript代碼(假定VBscript中有Raiserror敕令)
Raiserror('刪除湧現毛病,記載:' & @fTopName & '及其所屬內容沒有被刪除。',16,1)
-------------------------------------------------------------
好了,這個觸發器一切代碼我都具體說明了,願望年夜家看得懂,而且經由過程下面的說明進步數據庫操作的才能!
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved