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

数据库触发器的设置

发布时间: 2023-04-18 22:58:30

‘壹’ Oracle数据库中有关触发器问题

触发器是一种特殊类型的存储过程 它不同于存储过程 触发器主要是通过事件进行触发而被执行的 触发器的触发事件分可为 类 分别是DML事件 DDL事件和数据库事件 而存储过程可以通过存储过程名字而被直接调用 当对某一表进行诸如UPDATE INSERT DELETE 这些操作时 sql Server 就会自动执行触发器所定义的SQL 语句 从而确保对数据的处理必须符合由这些SQL 语句所定义的规则

触发器是特定事件出现的时候 自动执行的代码块 类似于存储过程 但是用户不能直接调用他们

触发器功能

允许/限制对表的修改

自动生成派生列 比如自增字段

强制数据一致性

提供审计和日志记录

防止无效的事务处理

启用复杂的业务逻辑

触发器种类

触发器的种类可划分为 种 数据操纵语言(DML)触发器 替代(INSTEAD OF)触发器 数据定义语言(DDL)触发器 数据库事件触发器

数据操纵语言(DML)触发器 简称DML触发器 是定义在表上的触发器 创建在表上 由DML事件引发的触发器 编写DML触发器时的两点要素是 确定触发的表 即在其上定义触发器的表 确定触发的事件 DML触发器的触发事件有INSERT UPDATE和DELETE三种;替代触发器 简称INSTEADOF触发器 创建在视图上 用来替换对视图进行的删除 插入和修改操作; 数据定义语言(DDL)触发器 简称DDL触发器 定义在模式上 触发事件是数据对象的创建和修改;数据库事件触发器 定义在整个数据库或模式上 触发事件是数据库事件

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

CREATE [OR REPLACE] TRIGGER 触发器名

{BEFORE|AFTER|INSTEAD OF} 触发事件 [OR 触发事件 ]

ON 表名

WHEN 触发条件

[FOR EACH ROW]

DECLARE

声明部分

BEGIN

主体部分

END;

其中

触发器名 触发器对象的名称 由于触发器是数据库自动执行的 因此该名称只是一个名称 没有实质的用途 一个触发器可由多个不同的数据操纵语言操作触发 在触发器中 可用INSERTING DELETING UPDATING谓词来区别不同的数据操纵语言操作 这些谓词可以在IF分支条件语句中作为判断条件来使用

触发时间 指明触发器何时执行 该值可取 触发的时间有BEFORE和AFTER两种 分别表示触发动作发生在DML语句执行之前和语句执行之后 确定触发级别 有语句级触发器和行级触发器两种 语句级触发器表示SQL语句只触发一次触发器 行级触发器表示SQL语句影响的每一行都要触发一次

Before 表示在数据库动作之前触发器执行;在SQL语句的执行过程中 如果存在行级BEFORE触发器 则SQL语句在对每一行操作之前 都要先执行一次行级BEFORE触发器 然后才对行进行操作 如果存在行级AFTER触发器 则SQL语句在对每一行操作之后 都要再执行一次行级AFTER触发器

after 表示在数据库动作之后出发器执行 如果存在语句级AFTER触发器 则在SQL语句执行完毕后 要最后执行一次语句级AFTER触发器

触发事件 指明哪些数据库动作会触发此触发器 指INSERT DELETE或UPDATE事件 事件可以并行出现 中间用OR连接;

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

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

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

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

for each row 表示触发器为行级触发器 省略则为语句级触发器 对表的每一行触发器执行一次

触发器的创建者或具有DROP ANY TIRGGER系统权限的人才能删除触发器 删除触发器的语法如下

DROP TIRGGER 触发器名

可以通过命令设置触发器的可用状态 使其暂时关闭或重新打开 即当触发器暂时不用时 可以将其置成无效状态 在使用时重新打开 该命令语法如下

ALTER TRIGGER 触发器名 {DISABLE|ENABLE}

其中 DISABLE表示使触发器失效 ENABLE表示使触发器生效

同存储过程类似 触发器可以用SHOW ERRORS 检查编译错误

如果有多个触发器被定义成为相同时间 相同事件触发 且最后定义的触发器是有效的 则最后定义的触发器被触发 其他触发器不执行 触发器体内禁止使用MIT ROLLBACK SAVEPOINT语句 也禁止直接或间接地调用含有上述语句的存储过程 定义一个触发器时要考虑上述多种情况 并根据具体的需要来决定触发器的种类

触发器的作用

触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性 除此之外 触发器还有其它许多不同的功能

( ) 强化约束(Enforce restriction)

触发器能够实现比CHECK 语句更为复杂的约束

( ) 跟踪变化Auditing changes

触发器可以侦测数据库内的操作 从而不允许数据库中未经许可的指定更新和变化

( ) 级联运行(Cascaded operation)

触发器可以侦测数据库内的操作 并自动地级联影响整个数据库的各项内容 例如 某个表上的触发器中包含有对另外一个表的数据操作(如删除 更新 插入)而该操作又导致该表上触发器被触发

( ) 存储过程的调用(Stored procere invocation)

为了响应数据库更新触 发器可以调用一个或多个存储过程 甚至可以通过外部过程的调用而在DBMS( 数据库管理系统)本身之外进行操作

由此可见 触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题 例如 触发器能够找出某一表在数据修改前后状态发生的差异 并根据这种差异执行一定的处理 此外一个表的同一类型(INSERT UPDATE DELETE)的多个触发器能够对同一种数据操作采取多种不同的处理

总体而言 触发器性能通常比较低

lishixin/Article/program/Oracle/201311/18340

‘贰’ sqlserver随机分配数据给不同客服

服务器端:

1.使用数据库触发器和存储过程:在数据表上设置一个触发器,当亏芦该表有新增数据时,触发器会调用一个存储过程,该存储过程会随机分配数据给不同客服。

2.使用数据库函数:可以在数据库中创建一个函数,其中包含一个随机数,每次调仿空野用函数时,根据该随机数来分配数据给不同的客服备喊。

‘叁’ 数据库触发器修改操作

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

这样你测试看看。

‘肆’ sql server数据库如何设置跨服务器的触发器

采用链接服务器注册远程数据库服务器到本机,这样就可以用链接服务器名.数闷配锋据库名卖茄来实现访蚂晌问,你不妨试试看。

‘伍’ 关于Sql Server里面设置触发器

可以使用ddl触发器,下面的网址介绍的很详细了,请参照:
http://bbs.ctocio.com.cn/thread-7825116-1-1.html
*************************
补充:
CREATE
TRIGGER
TEST_DDL_TRIGGER
ON
DATABASE
FOR
ALTER_TABLE
AS
BEGIN
RAISERROR
('这个数据库不允许alter
table操作!',
16,
1)
ROLLBACK
END
*************************
---
以上,希配扮望对你有所唤卖裤帮助。和简

‘陆’ 数据库触发器设置当数据更新(增加)时,另一张表也同时更新,但不知道为什么提示语法错误

digoal=# create table a (aid int primary key, aname text, time timestamp);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "a_pkey" for table "a"
CREATE TABLE
digoal=# create table b (id int primary key, name text, time timestamp);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "b_pkey" for table "b"
CREATE TABLE
digoal=# create or replace function tg_a () returns trigger as $$
declare
begin
case TG_OP
when 'INSERT' then
insert into b(id,name,time) values (NEW.aid, NEW.aname, NEW.time);
when 'UPDATE' then
update b set id=NEW.aid, name=NEW.aname, time=NEW.time where id=OLD.aid;
when 'DELETE' then
delete from b where id=OLD.aid;
when 'TRUNCATE' then
truncate b;
else
return NULL;
end case;
return NULL;
end;
$$ language plpgsql;
digoal=# create trigger tg_a after INSERT OR DELETE OR UPDATE ON a for each row execute procere tg_a();
CREATE TRIGGER
digoal=# create trigger tg_a_truncate after truncate ON a for each statement execute procere tg_a();
CREATE TRIGGER
digoal=# insert into a select generate_series(1,10),'digoal',clock_timestamp();
INSERT 0 10
digoal=# select * from a;
aid | aname | time
-----+--------+----------------------------
1 | digoal | 2013-02-03 18:59:37.592479
2 | digoal | 2013-02-03 18:59:37.592667
3 | digoal | 2013-02-03 18:59:37.592674
4 | digoal | 2013-02-03 18:59:37.592677
5 | digoal | 2013-02-03 18:59:37.59268
6 | digoal | 2013-02-03 18:59:37.592683
7 | digoal | 2013-02-03 18:59:37.592686
8 | digoal | 2013-02-03 18:59:37.59269
9 | digoal | 2013-02-03 18:59:37.592693
10 | digoal | 2013-02-03 18:59:37.592696
(10 rows)
digoal=# select * from b;
id | name | time
----+--------+----------------------------
1 | digoal | 2013-02-03 18:59:37.592479
2 | digoal | 2013-02-03 18:59:37.592667
3 | digoal | 2013-02-03 18:59:37.592674
4 | digoal | 2013-02-03 18:59:37.592677
5 | digoal | 2013-02-03 18:59:37.59268
6 | digoal | 2013-02-03 18:59:37.592683
7 | digoal | 2013-02-03 18:59:37.592686
8 | digoal | 2013-02-03 18:59:37.59269
9 | digoal | 2013-02-03 18:59:37.592693
10 | digoal | 2013-02-03 18:59:37.592696
(10 rows)
digoal=# delete from a where aid=1;
DELETE 1
digoal=# select * from b;
id | name | time
----+--------+----------------------------
2 | digoal | 2013-02-03 18:59:37.592667
3 | digoal | 2013-02-03 18:59:37.592674
4 | digoal | 2013-02-03 18:59:37.592677
5 | digoal | 2013-02-03 18:59:37.59268
6 | digoal | 2013-02-03 18:59:37.592683
7 | digoal | 2013-02-03 18:59:37.592686
8 | digoal | 2013-02-03 18:59:37.59269
9 | digoal | 2013-02-03 18:59:37.592693
10 | digoal | 2013-02-03 18:59:37.592696
(9 rows)
digoal=# select * from a;
aid | aname | time
-----+--------+----------------------------
2 | digoal | 2013-02-03 18:59:37.592667
3 | digoal | 2013-02-03 18:59:37.592674
4 | digoal | 2013-02-03 18:59:37.592677
5 | digoal | 2013-02-03 18:59:37.59268
6 | digoal | 2013-02-03 18:59:37.592683
7 | digoal | 2013-02-03 18:59:37.592686
8 | digoal | 2013-02-03 18:59:37.59269
9 | digoal | 2013-02-03 18:59:37.592693
10 | digoal | 2013-02-03 18:59:37.592696
(9 rows)

digoal=# update a set aname='new' where aid=2;
UPDATE 1
digoal=# select * from a where aid=2;
aid | aname | time
-----+-------+----------------------------
2 | new | 2013-02-03 18:59:37.592667
(1 row)
digoal=# select * from b where id=2;
id | name | time
----+------+----------------------------
2 | new | 2013-02-03 18:59:37.592667
(1 row)
digoal=# truncate a;
TRUNCATE TABLE
digoal=# select * from a;
aid | aname | time
-----+-------+------
(0 rows)
digoal=# select * from b;
id | name | time
----+------+------
(0 rows)

‘柒’ sql数据库触发器求指导

这个完全没有必要去创建触发器啊。

直接外键设置成 DELETE CASCADE 方式 的就可以了, 一行触发器的代码也不用写。


下面是具体的对比例子:

--创建测试主表.ID是主键.
CREATETABLEtest_main(
idINTNOTNULL,
valueVARCHAR(10),
PRIMARYKEY(id)
);


--创建测试子表.
CREATETABLEtest_sub(
idINTNOTNULL,
main_idINT,
valueVARCHAR(10),
PRIMARYKEY(id)
);


--插入测试主表数据.
INSERTINTOtest_main(id,value)VALUES(1,'ONE');
INSERTINTOtest_main(id,value)VALUES(2,'TWO');

--插入测试子表数据.
INSERTINTOtest_sub(id,main_id,value)VALUES(1,1,'ONEONE');
INSERTINTOtest_sub(id,main_id,value)VALUES(2,2,'TWOTWO');



上面是 测试表+测试数据

下面是 默认外键约束方式的例子

1>ALTERTABLEtest_subADDCONSTRAINTmain_id_consFOREIGNKEY(main_id)REFERENCEStest_main;
2>go
1>DELETE
2>test_main
3>WHERE
4>ID=1;
5>go
消息547,级别16,状态1,服务器HOME-BED592453CSQLEXPRESS,第1行
DELETE语句与REFERENCE约束"main_id_cons"冲突。该冲突发生于数据库"Stock",表"db
o.test_sub",column'main_id'。
语句已终止。


看看, 提示的错误信息, 和你的错误信息, 格式上是一样的。


下面是使用DELETE CASCADE 方式 的外键约束的例子

(需要删除掉前面创建的那个外键约束)


1>--创建外键(使用ONDELETECASCADE选项,删除主表的时候,同时删除子表)
2>ALTERTABLEtest_sub
3>ADDCONSTRAINTmain_id_cons
4>FOREIGNKEY(main_id)REFERENCEStest_mainONDELETECASCADE;
5>
6>--测试删除主表数据.将成功地执行.
7>DELETE
8>TEST_MAIN
9>WHERE
10>ID=1;
11>
12>--测试检索子表,应该只有一条main_id=2的数据.
13>SELECT
14>*
15>FROM
16>test_sub;
17>
18>go

(1行受影响)
idmain_idvalue
--------------------------------
22TWOTWO

(1行受影响)

‘捌’ Sql 2000数据库怎么创建触发器,有谁会,截个图显示出来看一下

1.使用T-SQL语句创建触发器
创建触发器使用CREATE TRIGGER语句。 语法格式如下:
CREATE TRIGGER 触发器名ON 表名 [WITH ENCRYPTION]
FOR {[DELETE][,][INSERT][,][UPDATE] } [NOT FOR REPLICATION] AS
SQL语句
[RETURE 整数表达式]
触发器作为一种数据库对象,在syscomment 表中存储有完整的文本定义信息。可以使用WITH ENCRYPTION 对访问syscomment表的入口进行加密。
NOT FOR REPLICATION: 定义在复制过程中,不执行触发器操作。 【例1】创建一个针对LWQK 表的触发器,打印共修改了多少行数据。
use lwzz
if exists (select name from sysobjects where name='tr_lwqk_update' and type='tr') drop trigger tr_lwqk_update go
use lwzz go
create trigger tr_lwqk_update on lwqk for update as
declare @msg varchar(100)
select @msg=str(@@rowcount)+'lwzz updated by this statement' print @msg return
go
在CREATE TRIGGER语句中不能使用SELECT语句返回对表格查询的数据,因为触发器不接受用户应用程序传递的参数,从而也无法向用户应用程序返回查询表格数据所得到的结果。 在创建触发器的语句中,禁止使用下列T-SQL语句: ALTER DATABASE ALTER PROCEDURE ALTER TABLE ALTER TRIGGER ALTER VIEW CREATE DATABASE CREATE DEFAULT CREATE INDEX CREATE PROCEDURE CREATE RULE CREATE TABLE CREATE TRIGGER DROP DATABASE DROP DEFAULT DROP INDEX DROP PROCEDURE DROP RULE DROP TABLE DROP TRIGGER DROP VIEW
GRANT RESTORE DATABASE RESTORE LOG REVOKE
TRUNCATE TABLE
由于系统表所存储数据的特殊性和重要性,所以建议用户不要自己在系统表上建立触发器。 在创建触发器时,不允许RETURN返回体现运行状态的数据。
【例2】创建一个当LWQK表执行INSERT、UPDATE操作时触发的触发器。
create trigger tr_procts_insupd

on lwqk
for insert,update as
……
由于SQL Sever 支持在同一个表的同一种操作类型上建立多个触发器,所以当建了tr_procts_insupd触发器后,在LWQK表执行INSERT操作时将触发tr_procts_insupd触发器,在执行UPDATE操作时将触发tr_proct_update和tr_procts_insupd触发器,他们都是有效的触发器。

‘玖’ 在数据库里怎么使用触发器

触发器是一类特殊的存储过程,开发人员也可以定义、编写符合业务需求的触发器来维护数据的完整性。触发器的控制流程及控制语句与存储过程相同,但触发器与存储过程还是有相当大的差别,触发器的定义格式及开启方式与存储过程不同,作为数据管理员或编程人员,熟练掌握触发器的用法对维护、操作数据库非常重要。基本语法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