当前位置:首页 » 数据仓库 » 触发器修改数据库
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

触发器修改数据库

发布时间: 2022-07-13 14:01:36

数据库的触发器怎么进行高级操作

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语句。它们主要用于强制服从复杂的业务规则或要求。触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。

触发器功能强大,可以轻松可靠地实现许多复杂的功能,但也不能过于依赖触发器,滥用触发器会造成关系数据库及应用程序维护困难,性能、效率低下等问题的产生,在实际问题中,要根据实际需要选择合适的解决方案。触发器是一种特殊的存储过程,在插入、删除、修改特定表中的数据时触发执行,拥有比数据库本身更强大的数据控制能力,其作用有以下四大方面。

1.数据安全数据安全主要是指对信息系统中的业务数据提供一种数据变更的审核机制,当其通过安全策略的审核后,允许用户变更相关数据,否则直接拒绝数据变更的请求。

安全原理:基于数据库的值使用户具有操作数据库的某种权利。

((1)可以基于时间限制用户的操作。例如,不允许下班后和节假日修改数据库数据。

(2)可以基于数据库中的数据限制用户的操作。例如,不允许股票价格的升幅一次超过10%。

2.数据审计数据审计主要是指对数据服务器上的记录进行变更时的一种用户权限的即时审查与用户行为的全方位记录,以便事后对数据变更过程的追溯,保证数据变更的合法性。

审计原理:跟踪用户对数据库的操作。

((1)审计用户操作数据库的语句。

(2)把用户对数据库的更新写入审计表。

3.数据约束数据约束是指对用户的操作行为将导致业务数据与实际情况相悖的行为进行检查约束,而不让其发生,从而保证数据的完整性与一致性。

约束原理:对用户操作与实际逻辑的约束检查。

((1)实现数据完整性检查和约束。例如,回退任何企图买进超过自己资金的货物。

(2)提供可变的缺省值。

4.数据连环更新数据连环更新是指当对数据进行更新操作时,将所有与此数据相关联的数据作联合的更新操作,以保证数据的完整性与一致性。

连环更新原理:对关联数据作联合更新操作。

((1)修改或删除时级联修改或删除其他表中与之匹配的行。

(2)修改或删除时把其他表中与之匹配的行设成NULL值。

(3)修改或删除时把其他表中与之匹配的行级联设成缺省值。

④ 数据库触发器有什么作用

触发器的作用:

自动计算数据值,如果数据的值达到了一定的要求,则进行特定的处理。

同步实时地复制表中的数据。

实现复杂的非标准的数据库相关完整性规则。

可在写入数据表前,强制检验或转换数据。

触发器发生错误时,异动的结果会被撤销。

部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。

可依照特定的情况,替换异动的指令 (INSTEAD OF)。


(4)触发器修改数据库扩展阅读:

分类

SQL Server 包括三种常规类型的触发器:DML 触发器、DDL 触发器和登录触发器。

DML触发器

当数据库中表中的数据发生变化时,包括insert,update,delete任意操作,如果我们对该表写了对应的DML触发器,那么该触发器自动执行。

DML触发器的主要作用在于强制执行业 务规则,以及扩展Sql Server约束,默认值等。因为我们知道约束只能约束同一个表中的数据,而触发器中则可以执行任意Sql命令。

DDL触发器

它是Sql Server2005新增的触发器,主要用于审核与规范对数据库中表,触发器,视图等结构上的操作。比如在修改表,修改列,新增表,新增列等。

它在数据库结构发生变化时执行,我们主要用它来记录数据库的修改过程,以及限制程序员对数据库的修改,比如不允许删除某些指定表等。

登录触发器

登录触发器将为响应 LOGIN 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。

因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。

参考资料来源:网络-触发器

⑤ 触发器在数据库设计和编程中起到什么重要作用

我的讲解:
简单来讲哪就是事件触发。
比如你对数据库中的表进行了一个插删等操作,你想在你即将做或者完成这个操作的时候程序能自动做一点别的工作,比如你想对插入数据检查一下或者对删除后的数据总数进行一下统计。

本来哪,你可以把这个工作写在自己的程序里,就是把检查写在你插入动作之前或者把统计数目写在删除动作之后。这样的问题是:你要做插删的时候就都要写这些代码,而且很容易就遗漏了。

而触发器哪,你定义在某个操作上,比如把那个检查的工作过程定义成插入的前触发器,把统计工作定义成后触发器,那么在你进行插入删除的时候,数据库那边的程序就自动的给你做了这个工作了。

主要作用哪:我感觉
一是完整性(防止自己编程的遗漏),
二是简单,
三是由数据库程序(比如Oracle)进行这项工作,而不是由你自己的程序做,效率高。

下面是人家的一些教程,其实道理是很简单的。你可以用它后面讲的几个数据库的例子,自己写一个,试试就知道了。

————————————————————————————————————————

一 触发器介绍

触发器是一种特殊的存储过程,它在插入,删除或修改特定表中

的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的

数据控制能力。数据库触发器有以下的作用:

* 安全性。可以基于数据库的值使用户具有操作数据库的某种权

利。

# 可以基于时间限制用户的操作,例如不允许下班后和节假日

修改数据库数据。

# 可以基于数据库中的数据限制用户的操作,例如不允许股票

的价格的升幅一次超过10%。

* 审计。可以跟踪用户对数据库的操作。

# 审计用户操作数据库的语句。

# 把用户对数据库的更新写入审计表。

* 实现复杂的数据完整性规则。

# 实现非标准的数据完整性检查和约束。触发器可产生比规则

更为复杂的限制。与规则不同,触发器可以引用列或数据库对

象。例如,触发器可回退任何企图吃进超过自己保证金的期货。

# 提供可变的缺省值。

* 实现复杂的非标准的数据库相关完整性规则。触发器可以对数

据库中相关的表进行连环更新。例如,在auths表author_code列上的

删除触发器可导致相应删除在其它表中的与之匹配的行。

# 在修改或删除时级联修改或删除其它表中的与之匹配的行。

# 在修改或删除时把其它表中的与之匹配的行设成NULL值。

# 在修改或删除时把其它表中的与之匹配的行级联设成缺省值。

# 触发器能够拒绝或回退那些破坏相关完整性的变化,取消试

图进行数据更新的事务。当插入一个与其主健不匹配的外部键

时,这种触发器会起作用。例如,可以在books.author_code

列上生成一个插入触发器,如果新值与auths.author_code列

中的某值不匹配时,插入被回退。

* 同步实时地复制表中的数据。

* 自动计算数据值,如果数据的值达到了一定的要求,则进行特

定的处理。例如,如果公司的帐号上的资金低于5万元则立即给财务人

员发送警告数据。

ORACLE与SYBASE数据库的触发器有一定的区别,下面将分别讲述

这两种数据库触发器的作用和写法。

二 ORACLE 触发器

ORACLE产生数据库触发器的语法为:

create [or replace] trigger 触发器名 触发时间 触发事件

on 表名

[for each row]

pl/sql 语句

其中:

触发器名:触发器对象的名称。由于触发器是数据库自动执行

的,因此该名称只是一个名称,没有实质的用途。

触发时间:指明触发器何时执行,该值可取:

before---表示在数据库动作之前触发器执行;

after---表示在数据库动作之后出发器执行。

触发事件:指明哪些数据库动作会触发此触发器:

insert:数据库插入会触发此触发器;

update:数据库修改会触发此触发器;

delete:数据库删除会触发此触发器。

表 名:数据库触发器所在的表。

for each row:对表的每一行触发器执行一次。如果没有这一

选项,则只对整个表执行一次。

举例:下面的触发器在更新表auths之前触发,目的是不允许在

周末修改表:

create trigger auth_secure

before insert or update or delete //对整表更新前触发

on auths

begin

if(to_char(sysdate,'DY')='SUN'

RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表auths');

end if;

end

三 SYBASE数据库触发器

SYBASE数据库触发器的作用与ORACLE非常类似,仅有较小的差异。

SYBASE产生触发器的语法为:

CREATE TRIGGER 触发器名

ON 表名

FOR INSERT,UPDATE,DELETE

AS

SQL_statement |

FOR INSERT,UPDATE

AS

IF UPDATE(column_name) [AND|OR UPDATE(column_name)]...

SQL_statements

上面FOR子句用来指定在触发器上的哪些数据更新命令可激活该

触发器。IF UPDATE子句检查对指定列的操作类型,在IF UPDATE子句

中可指定多个列。

与ORACLE不同,对于每条SQL语句,触发器只执行一次。触发器

在数据更新语句完成以后立即执行。触发器和启动它的语句被当作一

个事务处理,事务可以在触发器中回退。

下面举例说明SYBASE触发器的写法。

create trigger forinsert_books

on books

for insert

as

if(select count(*) from auths,inserted

where auths.author_code=insert.author_code)!=@@rowcount

begin

rollback transaction

print "books 表中 author_code 列的值在auths 表中不存在。"

end

⑥ 如何用触发器实现记录数据库表更改的记录

举个例子吧:
如:
记录表A的更新记录,
首先建立一个表:表AUpDataTemp
表结构和表A相同,
然后后面要多加1列,列名就取:DataType
吧,类型为
bit
1为更新后的数据(新数据),0为更新前的数据(旧数据):
触发器代码如下:
create
trigger
表A_UPDATA_TR
on
表A
for
update
as
insert
into
表AUpDataTemp
select
*,1
from
inserted
insert
into
表AUpDataTemp
select
*,0
from
deleted
当然,插入和删除数据更简单,插入只有新数据,删除只有旧数据
以上是MS-SQL,ORACLE只有触发器头格式不一样,思路没问题

⑦ 数据库触发器问题

--成绩表的插入触发器
Create Trigger tri_insert ON stu_grade
for insert
AS
set nocount on
Insert into Stu_info2
Select *
From Stu_info B
Where exists
(
Select 1 From stu_grade A,inserted I where A.学号=I.学号
And A.学号 = B.学号
And A.成绩< 60 Group by A.学号 having count(A.学号) > 4)
)
set nocount off


请参考 sql server 触发器,有问题进一步交流

⑧ 写入mysql数据库的触发器是怎么修改

drop TRIGGER [触发器名]--删除触发器
go
CREATE TRIGGER [触发器名] ON [表名] --创建触发器
FOR insert
AS
--写你要执行的代码

⑨ 数据库触发器修改操作

altertriggertr_UpdateDeptNo
onDepartment
INSTEADOFupdate,insert,delete
as
ifUpdate(DepID)
begin
setnocounton;
declare@DepIDCHAR(2)
declare@DepNamechar(20)
--变量赋值
select@depid=depid,@depname=depnamefrominserted
--修改
updateProfessionsetDepID=@DepIDwhereDepID=(=@DepName)
updateClassInfosetDepID=@DepIDwhereDepID=(=@DepName)
end

这样你测试看看。

⑩ 数据库触发器是什么

触发器是一类特殊的存储过程,被定义为在对表或视图发出 UPDATE、INSERT 或 DELETE 语句时自动执行。触发器是功能强大的工具,使每个站点可以在有数据修改时自动强制执行其业务规则。触发器可以扩展 SQL Server 约束、默认值和规则的完整性检查逻辑,但只要约束和默认值提供了全部所需的功能,就应使用约束和默认值。

表可以有多个触发器。CREATE TRIGGER 语句可以与 FOR UPDATE、FOR INSERT 或 FOR DELETE 子句一起使用,指定触发器专门用于特定类型的数据修改操作。当指定 FOR UPDATE 时,可以使用 IF UPDATE (column_name) 子句,指定触发器专门用于具体某列的更新。

代码是写在数据库里面的,触发器包含 Transact-SQL 语句,这与存储过程十分相似。

如果你有安装SQL SEVER,那么你可以在SQL SEVER的帮助文档里找到很多详细的解析,打开查询分析器按F1也可以打开SQL SEVER的帮助文档。

示例
下例首先创建一个触发器,当用户在表 roysched 中添加或更改数据时,该触发器向客户端打印一条用户定义消息。然后,使用 ALTER TRIGGER 语句使该触发器仅对 INSERT 活动有效。该触发器有助于提醒向表中插入行或更新行的用户及时通知书的作者和出版商。

USE pubs
GO
CREATE TRIGGER royalty_reminder
ON roysched
WITH ENCRYPTION
FOR INSERT, UPDATE
AS RAISERROR (50009, 16, 10)

-- Now, alter the trigger.
USE pubs
GO
ALTER TRIGGER royalty_reminder
ON roysched
FOR INSERT
AS RAISERROR (50009, 16, 10)