Ⅰ 資料庫 觸發器的編寫(在線等待)
create TRIGGER [觸發器名]
ON [dbo].[EMP]
FOR insert,update
AS
begin
update EMP set JOB=UPPER(JOB)
end
Ⅱ php+myql資料庫觸發器怎麼寫
如果公司里有上百個表要做觸發器,如果手動寫代碼的話。很累,一個小程序,自動生成mysql的觸發代碼。
<?php
$dbname = 'test';//資料庫
$tab1 = 'user'; //執行的表
$tab2 = 'user_bak'; //被觸發的表
$conn = mysql_connect("localhost","root", "root",$dbname) or
die("請檢查你的主機名資料庫用戶名和密碼");
mysql_select_db($dbname, $conn) or die("資料庫還沒有連接");
$query = mysql_query("SHOW COLUMNS FROM $tab1");mysql_query("");
while($row=mysql_fetch_array($query,MYSQL_NUM)){//得到表的欄位數組
$temp[] = $row[0];
$str1 .= '`'.$row[0].'`,';
$str2 .= 'new.'.$row[0].',';
$str3 .= $row[0].'=new.'.$row[0].',';
}
//insert觸發器
$inser_str = "<h1>{$tab1}表的insert觸發器</h1>";
$inser_str .= "create trigger ".$tab1."_insert <br>AFTER INSERT
<br>on ".$tab1."<br>";
$inser_str .="for each row<br> INSERT INTO {$tab2}
(".rtrim($str1,',').') VALUES ('.rtrim($str2,',').');';
//update觸發器
$update_str = "<h1>{$tab1}表的update觸發器</h1>";
$update_str .= "create trigger ".$tab1."_update<br>";
$update_str .= "after update<br>";
$update_str .= "on ".$tab1.'<br>';
$update_str .= "for each row<br>";
$update_str .= "update ".$tab2." set ".rtrim($str3,',')." where id =
new.id;//這里的where id = new.id要手動改一下。改成主鍵的欄位名";
//delete觸發器
$delete_str = "<h1>{$tab1}表的delete觸發器</h1>";
$delete_str .= "create trigger ".$tab1."_delete<br>";
$delete_str .= "after delete<br>";
$delete_str .= "on ".$tab1."<br>";
$delete_str .= "for each row <br>";
$delete_str .= "delete from ".$tab2." where id=OLD.id//這里的where id =
new.id要手動改一下。改成主鍵的欄位名<br>";
echo $inser_str;
echo $update_str;
echo $delete_str;
echo
'<p>注意:<br>1.觸發器可用於InnoDB或MyISAM類型的表<br>2.插入的時候用AFTER INSERT
更好的保證數據ID的對應,如果用before
INSERT有可能造成ID不對應<br>3.如new.id則是表示主表中的欄位<br>4.sql語句太多,用
begin..end<br>5.使用show triggers語句查看資料庫中的觸發器。<br>6.刪除觸發器DROP TRIGGER
IF EXISTS `test`<br>7.作者:<a
href="http://hi..com/woaidelphi">華夏之星</a>';
echo <<<EOT
<h3>語法:</h3>
create trigger <觸發器名稱><br>
{ before | after}<br>
{insert | update | delete}<br>
on <表名><br>
for each row<br>
<觸發器SQL語句><br>
參數詳解如下:<br>
create trigger <觸發器名稱>:創建一個新觸發器,並指定觸發器的名稱。<br>
{ before | after}:用於指定在insert、update或delete語句執行前觸發還是在語句執行後觸發。<br>
on <表名>:用於指定響應該觸發器的表名。<br>
for each row:觸發器的執行間隔,for each row
通知觸發器每隔一行執行一次動作,而不是對整個表執行一次。<br>
<觸發器SQL語句>:觸發器要執行的SQL語句,如果該觸發器要執行多條SQL語句,要將多條語句放在begin…end塊中。
<br>如:begin…end塊(它不能上phpadmin上運行。因為phpmyadmin沒有對begin...end解析。)<br>
mysql_query("<br>
create trigger user_delete<br>
after delete<br>
on user<br>
for each row BEGIN<br>
delete from user_bak where id=OLD.id;<br>
delete from aaa where id=OLD.id;<br>
END;");<br>
<br><br><br><br>
EOT;
?>
Ⅲ 資料庫的觸發器怎麼進行高級操作
1.new與old在資料庫的觸發器中經常會用到更新前的值和更新後的值,所以掌握new和old的語法很重要。
old:表示操作執行前的數據行。
new:表示操作執行後的數據行。
一User數據表如圖User數據表所示,若執行以下更新操作語句:updateUsersetscore=80whereuser_id=1
User數據表
則在此操作中,old表示未執行update語句前user_id=1這行記錄;而new表示執行update語句後user_id=1這行記錄。
從上面的表述中可知,new與old均表示某一行記錄,old所表示的是寫操作發生前的這一行舊數據,new則表示寫操作發生後的這一行新的數據。正因如此,可以把new與old看作面向對象編程裡面的一個對象或實例,與面向對象的方式類似,可用new.欄位名或old.欄位名的方式進行存取值。
old.欄位名:表示未執行操作前的該行對應的某欄位值。
new.欄位名:表示執行操作後的該行對應的某欄位值。
在上面User表的update操作中:old.score=60,表示update操作前score欄位的舊值是60。
new.score=80,表示update操作後score欄位的新值是80。
如果要使用new語句進行賦值,只能在before類型的觸發器中使用,不能在after類型的觸發器中使用。
更新操作前使用before先賦值,再插入資料庫中。如以下語句是正確的:.金額=0;END更新操作後,不能在after中用new賦值,因為操作已經結束,只能讀取內容。如以下語句是錯誤的:.金額=0;ENDnew與old的區別:前者可在before觸發器中賦值、取值,也可在after觸發器中取值;
後者只能用於取值,因為賦值沒有意義。
注意:INSERT語句,只有new合法;
DELETE語句,只有old才合法;
UPDATE語句,可以同時使用new和old。
2.before與afterbefore與after表示觸發器觸發的時間點是在寫操作開始之前,還是在寫操作完成後,正因為它們有時間點先後的問題,因此它們的功能與使用場合有非常大的差別。
(1)before((1)先完成觸發操作,再執行業務數據的增刪改。
(2)觸發的語句先於監視的業務語句。
(3)有機會影響即將發生的操作。
2)after((1)先完成業務數據的增刪改,再觸發。
(2)觸發的語句晚於監視的業務語句。
(3)無法影響前面的增刪改動作。
3.異常處理MySQL現有版本中不支持自定義異常,當某處需要拋出異常時,可拋出一個系統異常(類似運行異常)。如故意往不存在的表中插入數據等方式來觸發系統異常的拋出,當異常拋出時,本次正在執行的所有操作會終止執行,並回滾所有數據到操作發生前的狀態。
在觸發器中,需要拋出異常的場景有很多,以下兩個方面較為普遍:((1)新進來的數據不符合業務邏輯。
例如,①倉庫最大商品庫存數為10,訂單要求一次性購買數量20。
②銀行賬戶上只有50元,想要支付100元的賬單。
(2)許可權不足,不允許操作。
例如,①普通用戶通過非法途徑操作核心資源表。
②在非工作日修改業務數據。4.觸發器案例用mytab.sql腳本創建表環境,然後用下面語句創建觸發器。當往mytab表添加記錄時,觸發器中將拋出異常,導致所有操作終止,並回滾所有操作的數據。
DELIMITER//DROPTRIGGERIFEXISTSt_exception_trigger;CREATETRIGGERt_exception_--tab3表不存在
Ⅳ 求解答,sql server資料庫觸發器怎麼寫
基本語法
create trigger tri_name
on table
for insert/update/deleted
as
SQL code
例:
create trigger tri_mc(tri_mc:自定義觸發器的名稱)
on table (table:觸發的表名)
for insert (觸發類型:insert,插入數據觸發 update,更新數據觸發 delete,刪除數據觸發)
as
declare @kssj datetime (定義一個變數,做中間處理)
declare @sqbh char(40)
select @kssj = kssj,@sqbh = sqbh from inserted
(插入數據時,插入的數據在表 inserted
更新數據時,更新後的數據在表 inserted 更新前的數據在表中 deleted
刪除數據時,刪除的數據在表 deleted
不同的操作可以,取出不同的中間數據,做處理,例子中取出插入的數據)
update table2 set isks = 1,kksj = @kssj where sqbh = @sqbh
(根據中間處理做相應操作,例子的處理為,將插入的值同步更新到另一個表)
Ⅳ SQL觸發器寫法
觸發器(trigger)是SQL server 提供給程序員和數據分析員來保證數據完整性的一種方法,它是與表事件相關的特殊的存儲過程,它的執行不是由程序調用,也不是手工啟動,而是由事件來觸發,比如當對一個表進行操作( insert,delete, update)時就會激活它執行。觸發器經常用於加強數據的完整性約束和業務規則等。 觸發器可以從 DBA_TRIGGERS ,USER_TRIGGERS 數據字典中查到。SQL3的觸發器是一個能由系統自動執行對資料庫修改的語句。
語法:
DELIMITER |
CREATE TRIGGER `<databaseName>`.`<triggerName>`
< [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] >
ON [dbo]<tableName> //dbo代表該表的所有者
FOR EACH ROW
BEGIN
--do something
END |
例子:
-- 插入時執行觸發器
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
create trigger [dbo].[rscOpenInsert]
on [dbo].[RSC_INFO]
for insert
as www.2cto.com
DECLARE
@v_rscID varchar(50),
@v_status int
begin
select @v_rscID=rscID,@v_status=status from inserted;
--取得當前資源信息status>4 才插入信息
if @v_status > 4
begin
insert into RSC_OPEN_SYNCHRONOUS(rscID,opStatus,opDateTime) values (@v_rscID,'insert',getDate())
end
end
--- 更新時執行觸發器
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
create trigger [dbo].[rscOpenUpdate]
on [dbo].[RSC_INFO]
for update
as
DECLARE
@v_rscID varchar(50),
@v_status int
begin www.2cto.com
select @v_rscID=rscID,@v_status=status from inserted;
--取得當前資源信息status>4 才更新信息
if @v_status > 4
begin
update RSC_OPEN_SYNCHRONOUS set opStatus = 'update', opDateTime = getDate() where rscID=@v_rscID
end
end
Ⅵ sql資料庫觸發器如何編寫
建議這個用
級聯更新
、刪除
USE
tempdb
go
CREATE
TABLE
Class(ClassNO
CHAR(4)
PRIMARY
KEY,
ClassName
NVARCHAR(50),ADDRESS
NVARCHAR(100))
go
CREATE
TABLE
Student(StuName
NVARCHAR(50),Sex
NVARCHAR(1),Age
INT,ClassNO
CHAR(4)
REFERENCES
Class(ClassNO)
ON
UPDATE
CASCADE
on
DELETE
CASCADE
)
GO
INSERT
Class
SELECT
'0721',N'
網路工程師
班','201'
INSERT
Student
SELECT
N'高峰',N'男',23,'0721'
go
---不推薦用觸發器
create
trigger
tr_班級表
on
班級表
for
update
as
if(select
count(1)
from
deleted)=1
update
c
set
班級編號=i.班級編號
from
deleted
d,學生表
c,inserted
i
where
d.班級編號=c.班級編號
Ⅶ SQL資料庫中的觸發器怎麼寫啊急
CREATE TRIGGER trig_stu_update ON student
FOR UPDATE
AS
begin
end;
CREATE TRIGGER trig_stu_delete ON student
FOR DELETE
AS
begin
end;
------------------
上面是更新、刪除的觸發器模板,將你的代碼填在begin...end之間。
觸發器中經常用到的inserted,deleted。
inserted裡面存放了insert、update操作的插入值或更新後值。
deleted里存放的是update、delete操作的更新前值或刪除值。
使用方法:
declare @no int,@sex bit,@age int;
--insert、update取新值
select @no=no,@sex=sex,@age=age from inserted;
--delete、update刪除值
select @no=no,@sex=sex,@age=age from deleted;
Ⅷ 在資料庫里怎麼使用觸發器
觸發器是一類特殊的存儲過程,開發人員也可以定義、編寫符合業務需求的觸發器來維護數據的完整性。觸發器的控制流程及控制語句與存儲過程相同,但觸發器與存儲過程還是有相當大的差別,觸發器的定義格式及開啟方式與存儲過程不同,作為數據管理員或編程人員,熟練掌握觸發器的用法對維護、操作資料庫非常重要。基本語法1.創建觸發器語法格式創建語法:CREATETRIGGER+觸發器名稱+觸發時間點+觸發事件+ON+表名+FOREACHROWBEGIN…END其中,觸發時間點:BEFORE或AFTER,指明是在觸發事件之前還是之後執行。
觸發事件:INSERT、UPDATE、DELETE事件。例如,以下語句創建一個名字叫upd_check的觸發器,其在對account表作更新(UPDATE)操作之前(BEFORE)自動觸發。
CREATETRIGGERupd_…END2.刪除觸發器語法格式DROPTRIGGER+觸發器名稱3.觸發器案例用tab.sql腳本創建表環境,然後用下面語句創建觸發器。當往tab1表添加記錄後將觸發此觸發器,將此新記錄同時插入tab2表中。
DELIMITER//DROPTRIGGERIFEXISTSt_afterinsert_on_tab1;CREATETRIGGERt_afterinsert_on_(tab2_id)values(new.tab1_id);END;//DELIMITER;當用下面語句往tab1表插入記錄時,tab2表中同時也添加了同樣的記錄,如圖tab1數據表
tab1數據表
tab2數據表
INSERTINTOtab1(tab1_id)values(')
tab.sql
Ⅸ 觸發器的寫法
使用觸發器TRIGGER
INSERT TRIGGER
觸發器是由SQL語句集組成的代碼塊,在響應某些動作時激活該語句集.一個觸發器也可被解釋為特定類型的存儲過程,每當動作發生時執行該存儲過程:每當基礎表中數據受到數據操縱語言(DML)語句-INSERT,UPDATE,DELETE的影響時,觸發器就被激發.
觸發器的特徵:
1. 當任何數據修改語句發出時,它被sql server自動調用
2. 在存儲過程的情況下,它不能被顯式地調用或執行
3. 它防止了對數據的不正確,未授權的,和不一致的改變
4. 它不能返回數據給用戶
觸發器語法:
CREATE TRIGGER trigger_name
ON table_name
[WITH ENCRYPTION]
FOR[INSERT | UPDATE | DELETE]
AS sql_statement
幻表:
當觸發器激發對INSERT,DELETE,或UPDATE語句的響應時,兩個特殊的表被創建:插入表(Inserted)和刪除表(deleted),
示例:
create trigger trgInsertRequisiton
on Requistion
for insert
as
declare @VacnacyReported int
declare @ActualVacancy int
select @ActualVacancy = iBudgetedStrength - currentStrength
from Position join Inserted on
Position.cPositionCode = Inserted.cPositionCode
select @VancyReported = inserted.siNoOfVacancy
from inserted
if(@VancyReported > @ActualVacancy)
begin
print'The actual vacancies are less than the vacncies'
rollback transaction
end
return
DELETE TRIGGER
1.當試圖從觸發器表中刪除一行時,DELETE TRIGGER被觸發
2.使用DELETE TRIGGER觸發器來實現引用完整性約束主要有三種途徑:
1.串聯方法:每當從主表中刪除記錄時,刪除依賴表中的記錄
2.限制方法:如果相尖記錄出現在依賴表中,則限制從主表中刪除記錄
3.無效方法:每當一個記錄從主表中刪除時,把依賴表中所指列的值變為無效
select * from publisher;
create trigger trgfordel
on publisher
for delete
as
begin
print '您刪除的數據的內容為'
select * from deleted
end
delete from publisher where pub_id = 9;
UPDATE TRIGGER
當一個UPADATE觸發器被激發時,它使用關於其操作的兩個邏輯表-包含原始行的deleted表和存儲新行的insertd表.
例一:
create trigger trgUpdatePub
on Publisher
for update
as
if update(pub_id)
begin
print 'publisher id cannot be modified'
rollback tran
end
è當用戶試圖修改pub_id列時它就激發,它因此阻止用戶修改pub_id的內容並回滾整個事務
例二:
create trigger trgUpdateContractRecruiter
on ContractRecruiter
for update
as
declare @AvgPercentageCharge int
select @AvgPercentageCharge = avg(siPercentageCharge)
from ContractRecruiter
if(@AvgPercentageCharge > 11)
begin
print 'The average cannot be more than 11'
rollback transaction
end
修改觸發器語法:
alter trigger trigger_name
on table_name
[with encryption]
for[insert | delete | update]
as sql_statements
撤消觸發器:
DROP TRIGGER trigger_name[,...n]
通過觸發器加強數據的完整性
觸發器可以用來確保和加強業務規則和數據完整性,如,只有庫存中有該產品時,才可以出售,如果使用觸發器,它將會對不正確的事務做檢查,並確保只有有效的數據才能插入到表中.
例如:某種改變違反了引用完整性,那麼所有這樣的改變都被拒絕,因此所有試圖改變資料庫中的數據都被取消.
CREATE TRIGER trgUpdateDelete
ON TitleAuthor
FOR INSERT,UPDATE
AS
If (SELECT COUNT(*) FROM Titles t JOIN inserted i
ON t.Title_id = i.Title_Id) = 0
BEGIN
PRINT 'Invialid title ID entered'
ROLLBACK
END
IF(SELECT (COUNT(*) FROM Authors t JOIN inserted i
ON t.Au_Id = i.Au_Id) = 0
BEGIN
PRINT 'INVIALID author ID eneter'
ROLLBACK
END
多觸發器:
SQL SERVER允許在給定表中定義多個觸發器.這意味著單個DML語句可激活兩個或多個觸發器.觸發器以創建次序被激活.
AFTER 和 INSTEAD OF 觸發器
AFTER觸發器在功能上,是在DML操作執行成功後.再執行的觸發器.
如:
create triger trgDeletetitles
on Titles
AFTER DELETE
AS
PRINT 'DELETION SUCCESSFUL'
*********************************************************************
假如單個DML後有多個AFTER觸發器,你可以通過使用sp_settriggerorder系統存儲過程來改變這些觸發器的執行次序.
sp_settriggerorder<triggername>,<order-value>,<DML-operation>
ordervalue = FIRST | LAST | NONEè隨機順序
DML-operation 指出創建觸發器的DML操作.
sp_settriggerorder 'trgDeleteTitles' , 'FIRST', 'DELETE'
*********************************************************************
INSTEAD OF 觸發器 替換的觸發器
如:
create trigger trgPublisherDelete
on publishers
instead of delete
as
print 'Master records cannot be deleted!'
這種觸發器在一張表上只能創建一個
不正確之處。。歡迎大家指正