Ⅰ 数据库 触发器的编写(在线等待)
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!'
这种触发器在一张表上只能创建一个
不正确之处。。欢迎大家指正