//-------------------------------------調試觸發器//------------------------------------- 作者:四海為圈(原創) //------------------------------------- 1、創建存儲過程以便觸發觸發器 3、選擇單步運行存儲過程 2、在觸發事件的語句如:insert 、update 、delete語句時按f11 //------------------------------------- 本方法在sql server 2000+win2000 server 通過測試 本方法在vs.net 2003 + sql server 2000+win2000 server 通過測試 //-------------------------------------good轉貼請註明來源 維護網路道德是每個網民的義務 //-------------------------------------實例教學:一、打開sql查詢分析器 二、將以下sql語句復制到查詢窗口並運行use pubscreate trigger trigger_update on authorsfor updateasbeginprint(update lastname=hoho)endcreate proc authors_procinsertasbeginupdate authors set au_lname=hoho where au_id=172-32-1176end三、在左邊的對象瀏覽器中選擇pubs->存儲過程在authors_procinsert(如未出現請刷新pubs資料庫)上右擊彈出菜單選擇「調試...」
⑵ sql2008 怎麼調試觸發器
在項目中,單擊右鍵選擇"添加"->"觸發器",代碼如下(validateyear.cs):
using
system;
using
system.data;
using
system.data.sqlclient;
using
microsoft.sqlserver.server;
public
partial
class
triggers
{
//
為目標輸入現有表或視圖並取消對特性行的注釋
[microsoft.sqlserver.server.sqltrigger
(name="validateyear",
target="humanresources",
event="for
insert")]
public
static
void
validateyear()
{
//
用您的代碼替換
sqlconnection
conn
=
new
sqlconnection("context
connection=true");
//定義查詢
string
sql
=
"select
count(*)
"
+
"from
inserted
"
+
"where
year(modifieddate)<>2012";
sqlcommand
comm
=
new
sqlcommand(sql,
conn);
//打開連接
conn.open();
//獲得行數
int
numbadrows
=
(int)comm.executescalar();
if
(numbadrows
>
0)
{
//get
the
sqlpipe
sqlpipe
pipe
=
sqlcontext.pipe;
//role
back
and
raise
an
error
comm.commandtext
=
"raiseerror('修改錯誤',11,1)";
//send
the
error
try
{
}
catch
{
}
system.transactions.transaction.current.rollback();
}
conn.close();
}
}
用於驗證插入的數據是否合法,當插入表humanresources是,如果修改日期的年份不是2012將報錯。
另外要注意的是要使用system.transactions.transaction.current.rollback(),必須添加system.transactions的引用
⑶ 關於sql觸發器調試問題
在sql中,觸發器是一種特殊類型的存儲過程,它不同於sql的存儲過程。觸發器主要是通過事件進行觸發而被執行的,而存儲過程可以通過存儲過程名字而被直接調用。當對某一表進行諸如update、
insert、
delete
這些操作時,sql
server
就會自動執行觸發器所定義的sql
語句,從而確保對數據的處理必須符合由這些sql
語句所定義的規則。
觸發器的主要作用就是其能夠實現由主鍵和外鍵所不能保證的復雜的參照完整性和數據的一致性。除此之外,觸發器還有其它許多不同的功能:
(1)強化約束(enforce
restriction)
觸發器能夠實現比check
語句更為復雜的約束。
(2)跟蹤變化(auditing
changes)
觸發器可以偵測資料庫內的操作,從而不允許資料庫中未經許可的指定更新和變化。
(3)級聯運行(cascaded
operation)。
觸發器可以偵測資料庫內的操作,並自動地級聯影響整個資料庫的各項內容。例如,某個表上的觸發器中包含有對另外一個表的數據操作(如刪除,更新,插入)而該操作又導致該表上觸發器被觸發。
(4)存儲過程的調用(stored
procere
invocation)。
為了響應資料庫更新觸,發器可以調用一個或多個存儲過程,甚至可以通過外部過程的調用而在dbms(
資料庫管理系統)本身之外進行操作。
由此可見,觸發器可以解決高級形式的業務規則或復雜行為限制以及實現定製記錄等一些方面的問題。例如,觸發器能夠找出某一表在數據修改前後狀態發生的差異,並根據這種差異執行一定的處理。此外一個表的同一類型(insert、
update、
delete)的多個觸發器能夠對同一種數據操作採取多種不同的處理。
總體而言,觸發器性能通常比較低。當運行觸發器時,系統處理的大部分時間花費在參照其它表的這一處理上,因為這些表既不在內存中也不在資料庫設備上,而刪除表和插入表總是位於內存中。可見觸發器所參照的其它表的位置決定了操作要花費的時間長短。
觸發器的種類
sql
server
2000
支持兩種類型的觸發器:after
觸發器和instead
of
觸發器。其中after
觸發器即為sql
server
2000
版本以前所介紹的觸發器。該類型觸發器要求只有執行某一操作(insert
update
delete)
之後,觸發器才被觸發,且只能在表上定義。可以為針對表的同一操作定義多個觸發器。對於after
觸發器,可以定義哪一個觸發器被最先觸發,哪一個被最後觸發,通常使用系統過程sp_settriggerorder
來完成此任務。
instead
of
觸發器表示並不執行其所定義的操作(insert、
update、
delete),而僅是執行觸發器本身。既可在表上定義instead
of
觸發器,也可以在視圖上定義instead
of
觸發器,但對同一操作只能定義一個instead
of觸發器。
⑷ 如何使用sql觸發器
CREATE OR REPLACE TRIGGER INSERT_STU_TRIGGER
BEFORE INSERT ON STUDENT
FOR EACH ROW
DECLARE
v_alone_course number;
v_total_course number;
v_TRUEANSWER varchar2(20);
v_t1 number;
BEGIN
select j.題目編號1 into v_t1 from juanzi j where j.卷號=:new.卷號;
select t.分值,t.TRUEANSWER into v_alone_course,v_TRUEANSWER from timu t where t."題目編號"=v_t1;
if v_trueanswer = :new.答案1 then
select v_alone_course into :new.成績 from al;
end if;
END;
這個是按照你的需求寫的一個ORACLE資料庫的SQL語句。
下面這個是測試添加語句:
insert into student(學號,教師工號,卷號,答案1) VALUES(123456,40564,1001,'A');
⑸ c語言怎麼使用sql觸發器
c語言怎麼使用sql觸發器:
定義: 何為觸發器?在SQL Server裡面也就是對某一個表的一定的操作,觸發某種條件,從而執行的一段程序。觸發器是一個特殊的存儲過程。
常見的觸發器有三種:分別應用於Insert , Update , Delete 事件。
我為什麼要使用觸發器?比如,這么兩個表:
Create Table Student( --學生表
StudentID int primary key, --學號
....
)
Create Table BorrowRecord( --學生借書記錄表
BorrowRecord int identity(1,1), --流水號
StudentID int , --學號
BorrowDate datetime, --借出時間
ReturnDAte Datetime, --歸還時間
...
)
用到的功能有:
1.如果我更改了學生的學號,我希望他的借書記錄仍然與這個學生相關(也就是同時更改借書記錄表的學號);
2.如果該學生已經畢業,我希望刪除他的學號的同時,也刪除它的借書記錄。
等等。
這時候可以用到觸發器。對於1,創建一個Update觸發器:
Create Trigger truStudent
On Student --在Student表中創建觸發器
for Update --為什麼事件觸發
As --事件觸發後所要做的事情
if Update(StudentID)
begin
Update BorrowRecord
Set StudentID=i.StudentID
From BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted臨時表
Where br.StudentID=d.StudentID
end
理解觸發器裡面的兩個臨時的表:Deleted , Inserted 。注意Deleted 與Inserted分別表示觸發事件的表「舊的一條記錄」和「新的一條記錄」。
一個資料庫系統中有兩個虛擬表用於存儲在表中記錄改動的信息,分別是:
虛擬表Inserted 虛擬表Deleted
在表記錄新增時 存放新增的記錄 不存儲記錄
修改時 存放用來更新的新記錄 存放更新前的記錄
刪除時 不存儲記錄 存放被刪除的記錄
一個Update 的過程可以看作為:生成新的記錄到Inserted表,復制舊的記錄到Deleted表,然後刪除Student記錄並寫入新紀錄。
對於2,創建一個Delete觸發器
Create trigger trdStudent
On Student
for Delete
As
Delete BorrowRecord
From BorrowRecord br , Delted d
Where br.StudentID=d.StudentID
從這兩個例子我們可以看到了觸發器的關鍵:A.2個臨時的表;B.觸發機制。
⑹ sql server觸發器怎麼設置
--SQL觸發器語法參考
CreateTRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR |AFTER | INSTEAD OF } { [ Insert ] [ , ] [ Update ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF Update ( column )
[ { AND | or } Update ( column ) ]
[ ...n ]
| IF ( COLUMNS_UpdateD ( ) { bitwise_operator } updated_bitmask)
{ comparison_operator } column_bitmask [ ...n ]
} ]
sql_statement [ ...n ]
}
}
是否可以解決您的問題?
⑺ SQL server 如何調試觸發器!
一、打開sql查詢分析器;
二、將以下sql語句復制到查詢窗口並運行;
usepubs
createtriggertrigger_updateonauthors
forupdate
as
begin
print(updatelastname=hoho)
end
createprocauthors_procinsert
as
begin
updateauthorssetau_lname=hohowhereau_id=172-32-1176
end
三、在左邊的對象瀏覽器中選擇pubs->存儲過程在authors_procinsert(如未出現請刷新pubs資料庫)上右擊彈出菜單選擇「調試...」。
四、當運行到" update authors set au_lname=hoho where au_id=172-32-1176「時按「f11」即進入觸發器代碼。
⑻ Sql設置觸發器
/*www.technical-programming.com,losauer2013
Target:MS/
description:Uponupdate,therows'-timestamp,
.
statement,thesuppliedvalueissetasis.
Thetstampfieldisdefinedas:
[__unixtimestamp]INTNULL
Theprimarykeyisdefinedas:
[ID]INTIDENTITY(1,1)NOTNULL
*/
FORUPDATEAS
IFUPDATE(__unixtimestamp)
BEGIN
SETNOCOUNTON--'affectedrows'count
UPDATEdbo.[mytable]
SETdbo.[mytable].[__unixtimestamp]=Inserted.[__unixtimestamp]/*+1*/
FROMdbo.[mytable],Inserted,Deleted
WHEREdbo.[mytable].[ID]=Inserted.[ID]
END
ELSE
BEGIN
SETNOCOUNTON--'affectedrows'count
UPDATEdbo.[mytable]
SETdbo.[mytable].[__unixtimestamp]=(CASEWHENInserted.[__unixtimestamp]>''THENDATEDIFF(s,'19700101',GetDate())
ELSEInserted.[__unixtimestamp]END)
FROMdbo.[mytable],Inserted
WHEREdbo.[mytable].[ID]=Inserted.[ID]
END
/*Shortalternative,foruseinaproctiveenvironment*/
FORUPDATEAS
IFNOTUPDATE(__unixtimestamp)
BEGIN
SETNOCOUNTON--'affectedrows'count
UPDATEdbo.[mytable]
SETdbo.[mytable].[__unixtimestamp]=(CASEWHENInserted.[__unixtimestamp]>''THENDATEDIFF(s,'19700101',GetDate())
ELSEInserted.[__unixtimestamp]END)
FROMdbo.[mytable],Inserted
WHEREdbo.[mytable].[ID]=Inserted.[ID]