其 他 回 答共2條
1樓
基本RS觸發(fā)器原理
1 基本RS觸發(fā)器的工作原理
基本RS觸發(fā)器的電路如圖1(a)所示。它是由兩個(gè)與非門(mén),按正反饋方式閉合而成,也可以用兩個(gè)或非門(mén)按正反饋方式閉合而成。圖(b)是基本RS觸發(fā)器邏輯符號(hào)?;綬S觸發(fā)器也稱(chēng)為閂鎖(Latch)觸發(fā)器。
(a) (b)
圖1 基本RS觸發(fā)器電路圖和邏輯符號(hào)
定義A門(mén)的一個(gè)輸入端為Rd 端,低電平有效,稱(chēng)為直接置“0”端,或直接復(fù)位端(Reset),此時(shí) Sd 端應(yīng)為高電平;B門(mén)的一個(gè)輸入端為 Sd 端,稱(chēng)為直接置“1”端,或直接置位端(Set),此時(shí) Rd 端應(yīng)為高電平。我們定義一個(gè)與非門(mén)的輸出端為基本RS觸發(fā)器的輸出端Q ,圖中為B門(mén)的輸出端。另一個(gè)與非門(mén)的輸出端為 Q 端,這兩個(gè)端頭的狀態(tài)應(yīng)該相反。因基本RS觸發(fā)器的電路是對(duì)稱(chēng)的,定義A門(mén)的輸出端為Q端, 還是定義B門(mén)的輸出端為Q端都是可以的。一旦Q端確定, Rd和 Sd 端就隨之確定,再不能任意更改。
2 兩個(gè)穩(wěn)態(tài)
這種電路結(jié)構(gòu),可以形成兩個(gè)穩(wěn)態(tài),即
Q =1,Q=0,Q=0,Q =1
當(dāng) Q=1時(shí),Q=1和 Rd =1決定了A門(mén)的輸出,即Q=0 , Q=0反饋回來(lái)又保證了Q=1 ;當(dāng) Q=0時(shí),Q=1,Q=1和 Sd =1決定了B門(mén)的輸出,即 Q=0,Q=0又保證了Q =1 。
在沒(méi)有加入觸發(fā)信號(hào)之前,即 Rd和Sd 端都是高電平,電路的狀態(tài)不會(huì)改變。
3 觸發(fā)翻轉(zhuǎn)
電路要改變狀態(tài)必須加入觸發(fā)信號(hào),因是與非門(mén)構(gòu)成的基本RS觸發(fā)器,所以,觸發(fā)信號(hào)是低電平有效。若是由或非門(mén)構(gòu)成的基本RS觸發(fā)器,觸發(fā)信號(hào)是高電平有效。
Rd和Sd 是一次信號(hào),只能一個(gè)一個(gè)的加,即它們不能同時(shí)為低電平。
在 Rd 端加低電平觸發(fā)信號(hào),Rd =0,于是Q =1 , Q =1和Sd =1決定了Q=0 ,觸發(fā)器置“0”。 Rd 是置“0”的觸發(fā)器信號(hào)。
Q=0以后,反饋回來(lái)就可以替代Rd =0的作用, Rd=0就可以撤消了。所以, Rd 不需要長(zhǎng)時(shí)間保留,是一個(gè)觸發(fā)器信號(hào)。
在Sd 端加低電平觸發(fā)信號(hào),Sd =0,于是Q =1 , Q =1和 Rd =1決定了Q=0 ,觸發(fā)器置“1”。但Q=0 反饋回來(lái), Sd =0才可以撤消, Sd是置“1”的觸發(fā)器信號(hào)。
如果是由或非門(mén)構(gòu)成的基本RS觸發(fā)器,觸發(fā)信號(hào)是高電平有效。此時(shí)直接置“0”端用符號(hào)Rd;直接置“1”端用符號(hào)Sd。
4 真值表和特征方程
以上過(guò)程,可以用真值表來(lái)描述,見(jiàn)上表。表中的Qn和 Qn表示觸發(fā)器的現(xiàn)在狀態(tài),簡(jiǎn)稱(chēng)現(xiàn)態(tài);Qn+1和Qn+1表示觸發(fā)器在觸發(fā)脈沖作用后輸出端的新?tīng)顟B(tài),簡(jiǎn)稱(chēng)次態(tài)。對(duì)于新?tīng)顟B(tài)Qn+1而言,Qn也稱(chēng)為原狀態(tài)。
上表真值表 表中Qn=Qn+1表示新?tīng)顟B(tài)等于原狀態(tài),即觸發(fā)器沒(méi)有翻轉(zhuǎn),觸發(fā)器的狀態(tài)保持不變。必須注意的是,一般書(shū)上列出的基本RS觸發(fā)器的真值表中,當(dāng) Rd =0、 Sd =0時(shí),Q的狀態(tài)為任意態(tài)。這是指當(dāng) Rd 、Sd 同時(shí)撤消時(shí),Q端狀態(tài)不定。若當(dāng) Rd =0、Sd =0時(shí),Q =1,狀態(tài)都為“1”,是確定的。但這一狀態(tài)違背了觸發(fā)器Q端和 Q端狀態(tài)必須相反的規(guī)定,是不正常的工作狀態(tài)。若Rd 、Sd不同時(shí)撤消時(shí),Q端狀態(tài)是確定的,但若Rd 、Sd同時(shí)撤消時(shí),Q端狀態(tài)是不確定的。由于與非門(mén)響應(yīng)有延遲,且兩個(gè)門(mén)延遲時(shí)間不同,這時(shí)哪個(gè)門(mén)先動(dòng)做了,觸發(fā)器就保持該狀態(tài),這一點(diǎn)一定不要誤解。但具體可見(jiàn)例1 。
把上表所列邏輯關(guān)系寫(xiě)成邏輯函數(shù)式,則得到
利用約束條件將上式化簡(jiǎn),于是得到特征方程
2樓
一、創(chuàng)建一個(gè)簡(jiǎn)單的觸發(fā)器
觸發(fā)器是一種特殊的存儲(chǔ)過(guò)程,類(lèi)似于事件函數(shù),SQL Server? 允許為 INSERT、UPDATE、DELETE 創(chuàng)建觸發(fā)器,即當(dāng)在表中插入、更新、刪除記錄時(shí),觸發(fā)一個(gè)或一系列 T-SQL語(yǔ)句。
觸發(fā)器可以在查詢(xún)分析器里創(chuàng)建,也可以在表名上點(diǎn)右鍵->“所有任務(wù)”->“管理觸發(fā)器”來(lái)創(chuàng)建,不過(guò)都是要寫(xiě) T-SQL 語(yǔ)句的,只是在查詢(xún)分析器里要先確定當(dāng)前操作的數(shù)據(jù)庫(kù)。
創(chuàng)建觸發(fā)器用 CREATE TRIGGER
CREATE TRIGGER 觸發(fā)器名稱(chēng)
ON 表名
FOR INSERT、UPDATE 或 DELETE
AS
T-SQL 語(yǔ)句
注意:觸發(fā)器名稱(chēng)是不加引號(hào)的。
如下是聯(lián)機(jī)叢書(shū)上的一個(gè)示例,當(dāng)在 titles 表上更改記錄時(shí),發(fā)送郵件通知 MaryM。
CREATE TRIGGER reminder
ON titles
FOR INSERT, UPDATE, DELETE
AS
EXEC master..xp_sendmail 'MaryM',
'Don''t forget to print a report for the distributors.'
二、刪除觸發(fā)器
用查詢(xún)分析器刪除
在查詢(xún)分析器中使用 drop trigger 觸發(fā)器名稱(chēng) 來(lái)刪除觸發(fā)器。
也可以同時(shí)刪除多個(gè)觸發(fā)器:drop trigger 觸發(fā)器名稱(chēng),觸發(fā)器名稱(chēng)...
注意:觸發(fā)器名稱(chēng)是不加引號(hào)的。在刪除觸發(fā)器之前可以先看一下觸發(fā)器是否存在:
if Exists(select name from sysobjects where name=觸發(fā)器名稱(chēng) and xtype='TR')
用企業(yè)管理器刪除
在企業(yè)管理器中,在表上點(diǎn)右鍵->“所有任務(wù)”->“管理觸發(fā)器”,選中所要?jiǎng)h除的觸發(fā)器,然后點(diǎn)擊“刪除”。
三、重命名觸發(fā)器
用查詢(xún)分析器重命名
exec sp_rename 原名稱(chēng), 新名稱(chēng)
sp_rename 是 SQL Server? 自帶的一個(gè)存儲(chǔ)過(guò)程,用于更改當(dāng)前數(shù)據(jù)庫(kù)中用戶(hù)創(chuàng)建的對(duì)象的名稱(chēng),如表名、列表、索引名等。
用企業(yè)管理器重命名
在表上點(diǎn)右鍵->“所有任務(wù)”->“管理觸發(fā)器”,選中所要重命名的觸發(fā)器,修改觸發(fā)器語(yǔ)句中的觸發(fā)器名稱(chēng),點(diǎn)擊“確定”。
四、more....
INSTEAD OF
執(zhí)行觸發(fā)器語(yǔ)句,但不執(zhí)行觸發(fā)觸發(fā)器的 SQL 語(yǔ)句,比如試圖刪除一條記錄時(shí),將執(zhí)行觸發(fā)器指定的語(yǔ)句,此時(shí)不再執(zhí)行 delete 語(yǔ)句。例:
create trigger f
on tbl
instead of delete
as
insert into Logs...
IF UPDATE(列名)
檢查是否更新了某一列,用于 insert 或 update,不能用于 delete。例:
create trigger f
on tbl
for update
as
if update(status) or update(title)
sql_statement --更新了 status 或 title 列
inserted、deleted
這是兩個(gè)虛擬表,inserted 保存的是 insert 或 update 之后所影響的記錄形成的表,deleted 保存的是 delete 或 update 之前所影響的記錄形成的表。例:
create trigger tbl_delete
on tbl
for delete
as
declare @title varchar(200)
select @title=title from deleted
insert into Logs(logContent) values('刪除了 title 為:' + title + '的記錄')
說(shuō)明:如果向 inserted 或 deleted 虛擬表中取字段類(lèi)型為 text、image 的字段值時(shí),所取得的值將會(huì)是 null。
五、查看數(shù)據(jù)庫(kù)中所有的觸發(fā)器
在查詢(xún)分析器中運(yùn)行:
use 數(shù)據(jù)庫(kù)名
go
select * from sysobjects where xtype='TR'
sysobjects 保存著數(shù)據(jù)庫(kù)的對(duì)象,其中 xtype 為 TR 的記錄即為觸發(fā)器對(duì)象。在 name 一列,我們可以看到觸發(fā)器名稱(chēng)。
六、sp_helptext 查看觸發(fā)器內(nèi)容
用查詢(xún)分析器查看
use 數(shù)據(jù)庫(kù)名
go
exec sp_helptext '觸發(fā)器名稱(chēng)'
將會(huì)以表的樣式顯示觸發(fā)器內(nèi)容。
除了觸發(fā)器外,sp_helptext 還可以顯示 規(guī)則、默認(rèn)值、未加密的存儲(chǔ)過(guò)程、用戶(hù)定義函數(shù)、視圖的文本
用企業(yè)管理器查看
在表上點(diǎn)右鍵->“所有任務(wù)”->“管理觸發(fā)器”,選擇所要查看的觸發(fā)器存儲(chǔ)過(guò)程
七、sp_helptrigger 用于查看觸發(fā)器的屬性
sp_helptrigger 有兩個(gè)參數(shù):第一個(gè)參數(shù)為表名;第二個(gè)為觸發(fā)器類(lèi)型,為 char(6) 類(lèi)型,可以是 INSERT、UPDATE、DELETE,如果省略則顯示指定表中所有類(lèi)型觸發(fā)器的屬性。
例:
use 數(shù)據(jù)庫(kù)名
go
exec sp_helptrigger tbl
八、遞歸、嵌套觸發(fā)器
遞歸分兩種,間接遞歸和直接遞歸。我們舉例解釋如下,假如有表1、表2名稱(chēng)分別為 T1、T2,在 T1、T2 上分別有觸發(fā)器 G1、G2。
?間接遞歸:對(duì) T1 操作從而觸發(fā) G1,G1 對(duì) T2 操作從而觸發(fā) G2,G2 對(duì) T1 操作從而再次觸發(fā) G1...
?直接遞歸:對(duì) T1 操作從而觸發(fā) G1,G1 對(duì) T1 操作從而再次觸發(fā) G1...
嵌套觸發(fā)器
類(lèi)似于間接遞歸,間接遞歸必然要形成一個(gè)環(huán),而嵌套觸發(fā)器不一定要形成一個(gè)環(huán),它可以 T1->T2->T3...這樣一直觸發(fā)下去,最多允許嵌套 32 層。
設(shè)置直接遞歸
默認(rèn)情況下是禁止直接遞歸的,要設(shè)置為允許有兩種方法:
?T-SQL:exec sp_dboption 'dbName', 'recursive triggers', true
?EM:數(shù)據(jù)庫(kù)上點(diǎn)右鍵->屬性->選項(xiàng)。
設(shè)置間接遞歸、嵌套
默認(rèn)情況下是允許間接遞歸、嵌套的,要設(shè)置為禁止有兩種方法:
?T-SQL:exec sp_configure 'nested triggers', 0 --第二個(gè)參數(shù)為 1 則為允許
?EM:注冊(cè)上點(diǎn)右鍵->屬性->服務(wù)器設(shè)置。
九、觸發(fā)器回滾
我們看到許多注冊(cè)系統(tǒng)在注冊(cè)后都不能更改用戶(hù)名,但這多半是由應(yīng)用程序決定的, 如果直接打開(kāi)數(shù)據(jù)庫(kù)表進(jìn)行更改,同樣可以更改其用戶(hù)名,在觸發(fā)器中利用回滾就可以巧妙地實(shí)現(xiàn)無(wú)法更改用戶(hù)名。
use 數(shù)據(jù)庫(kù)名
go
create trigger tr
on 表名
for update
as
if update(userName)
rollback tran
關(guān)鍵在最后兩句,其解釋為:如果更新了 userName 列,就回滾事務(wù)。
十、禁用、啟用觸發(fā)器
禁用:alter table 表名 disable trigger 觸發(fā)器名稱(chēng)
啟用:alter table 表名 enable trigger 觸發(fā)器名稱(chēng)
如果有多個(gè)觸發(fā)器,則各個(gè)觸發(fā)器名稱(chēng)之間用英文逗號(hào)隔開(kāi)。
如果把“觸發(fā)器名稱(chēng)”換成“ALL”,則表示禁用或啟用該表的全部觸發(fā)器。