文档库 最新最全的文档下载
当前位置:文档库 › 触发器语句

触发器语句

您还未登录!|登录|注册|帮助

CSDN首页

资讯

论坛

博客

下载

搜索

更多

CTO俱乐部

学生大本营

培训充电

移动开发

软件研发

云计算

程序员

ITeye

TUP

chinayuan的专栏

目录视图

摘要视图

订阅

精创之作《雷神的微软平台安全宝典》诚邀译者移动业界领袖会议·上海·6.20

CSDN博客频道“移动开发之我见”主题征文活动【分享季1】:网友推荐130个经典资源,分享再赠分!

数据库触发器

分类:数据库2011-03-31 18:00 2889人阅读评论(2) 收藏举报

触发器

Oracle 触发器:

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

功能:

1 、允许/ 限制对表的修改

2 、自动生成派生列,比如自增字段

3 、强制数据一致性

4 、提供审计和日志记录

5 、防止无效的事务处理

6 、启用复杂的业务逻辑

开始:

create trigger biufer_employees_department_id

before insert or update

of department_id

on employees

referencing old as old_value

new as new_value

for each row

when (new_value.department_id<>80 )

begin

:new_https://www.wendangku.net/doc/2619378572.html,mission_pct :=0;

end;

/

触发器的组成部分:

1 、触发器名称

2 、触发语句

3 、触发器限制

4 、触发操作

1 、触发器名称

create trigger biufer_employees_department_id

命名习惯:

biufer (before insert update for each row )

employees 表名

department_id 列名

2 、触发语句

比如:

表或视图上的DML 语句;DDL 语句,数据库关闭或启动,startup shutdown 等等before insert or update

of department_id

on employees

referencing old as old_value

new as new_value

for each row

说明:

( 1 )、无论是否规定了department_id ,对employees 表进行insert 的时候

( 2 )、对employees 表的department_id 列进行update 的时候

3 、触发器限制

when (new_value.department_id<>80 )

限制不是必须的。此例表示如果列department_id 不等于80 的时候,触发器就会执行。其中的new_value 是代表跟新之后的值。

4 、触发操作

是触发器的主体

begin

:new_https://www.wendangku.net/doc/2619378572.html,mission_pct :=0;

end;

主体很简单,就是将更新后的commission_pct 列置为0

触发:

insert into employees

(employee_id,last_name,first_name,hire_date,job_id,email,department_id,salary,commission_pct ) values( 12345,‟Chen‟,‟Donny‟, sysdate, 12, …donny@https://www.wendangku.net/doc/2619378572.html,‟,60,10000,.25);

select commission_pct from employees where employee_id=12345;

触发器不会通知用户,便改变了用户的输入值。

触发器类型:

1 、语句触发器

2 、行触发器

3 、INSTEAD OF 触发器

4 、系统条件触发器

5 、用户事件触发器

1 、语句触发器

是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器。能够与INSERT 、UPDA TE 、DELETE 或者组合上进行关联。但是无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次。比如,无论update 多少行,也只会调用一次update 语句触发器。

例子:

需要对在表上进行DML 操作的用户进行安全检查,看是否具有合适的特权。

Create table foo(a number);

Create trigger biud_foo

Before insert or update or delete

On foo

Begin

If user not in (…DONNY‟) then

Raise_application_error(-20001, …Y ou don‟t have access to modify this table.‟);

End if;

End;

/

即使SYS ,SYSTEM 用户也不能修改foo 表

[ 试验]

对修改表的时间、人物进行日志记录。

1 、建立试验表

create table employees_copy as select *from hr.employees

2 、建立日志表

create table employees_log( who varchar2(30), when date);

3 、在employees_copy 表上建立语句触发器,在触发器中填充employees_log 表。Create or replace trigger biud_employee_copy

Before insert or update or delete

On employees_copy

Begin

Insert into employees_log( Who,when) V alues( user, sysdate);

End;

/

4 、测试

update employees_copy set salary= salary*1.1;

select *from employess_log;

5 、确定是哪个语句起作用?

即是INSERT/UPDA TE/DELETE 中的哪一个触发了触发器?

可以在触发器中使用INSERTING / UPDA TING / DELETING 条件谓词,作判断:begin

if inserting then

-----

elsif updating then

-----

elsif deleting then

------

end if;

end;

if updating(…COL1‟) or updating(…COL2‟) then

------

end if;

[ 试验]

1 、修改日志表

alter table employees_log add (action varchar2(20));

2 、修改触发器,以便记录语句类型。

Create or replace trigger biud_employee_copy

Before insert or update or delete

On employees_copy

Declare

L_action employees_log.action%type;

Begin

if inserting then

l_action:=‟Insert‟;

elsif updating then

l_action:=‟Update‟;

elsif deleting then

l_action:=‟Delete‟;

else

raise_application_error(-20001,‟Y ou should never ever get this error.‟);

Insert into employees_log( Who,action,when) V alues( user, l_action,sysdate); End;

/

3 、测试

insert into employees_copy( employee_id, last_name, email, hire_date, job_id)

values(12345,‟Chen‟,‟Donny@hotmail‟,sysdate,12);

select *from employees_log

update employees_copy set salary=50000 where employee_id = 12345;

2 、行触发器

是指为受到影响的各个行激活的触发器,定义与语句触发器类似,有以下两个例外:

1 、定义语句中包含FOR EACH ROW 子句

2 、在BEFORE ……FOR EACH ROW 触发器中,用户可以引用受到影响的行值。

比如:

定义:

create trigger biufer_employees_department_id

before insert or update

of department_id

on employees_copy

referencing old as old_value

new as new_value

for each row

when (new_value.department_id<>80 )

begin

:new_https://www.wendangku.net/doc/2619378572.html,mission_pct :=0;

end;

/

Referencing 子句:

执行DML 语句之前的值的默认名称是:old , 之后的值是:new

insert 操作只有:new

delete 操作只有:old

update 操作两者都有

referencing 子句只是将new 和old 重命名为new_value 和old_value ,目的是避免混淆。比如操作一个名为new 的表时。作用不很大。

[ 试验] :为主健生成自增序列号

drop table foo;

create table foo(id number, data varchar2(20));

create sequence foo_seq;

create or replace trigger bifer_foo_id_pk

before insert on foo

for each row

begin

select foo_seq.nextval into :new.id from dual;

end;

/

insert into foo(data) values(…donny‟);

insert into foo values(5,‟Chen‟);

select * from foo;

3 、INSTEAD OF 触发器更新视图

instead of 触发器,可以实现: 不执行导致trigger 触发的语句,而只执行触发器. INSTEAD OF triggers provide a transparent way of modifying views that cannot be modified directly through DML statements (INSERT, UPDA TE, and DELETE). These triggers are called INSTEAD OF triggers because, unlike other types of triggers, Oracle fires the trigger instead of executing the triggering statement. Y ou can write normal INSERT, UPDA TE, and DELETE statements against the view and the INSTEAD OF trigger is fired to update the underlying tables appropriately. INSTEAD OF triggers are activated for each row of the view that gets modified.

Create or replace view company_phone_book as

Select first_name||‟, ‟||last_name name, email, phone_number,employee_id emp_id

From hr.employees;

尝试更新email 和name

update https://www.wendangku.net/doc/2619378572.html,pany_phone_book set name=‟Chen1, Donny1‟ where emp_id=100

create or replace trigger update_name_company_phone_book

INSTEAD OF

Update on https://www.wendangku.net/doc/2619378572.html,pany_phone_book

Begin

Update hr.employees

Set employee_id=:new.emp_id,

First_name=substr(:https://www.wendangku.net/doc/2619378572.html,, instr(:https://www.wendangku.net/doc/2619378572.html,,‟,‟)+2),

last_name= substr(:https://www.wendangku.net/doc/2619378572.html,,1,instr(:https://www.wendangku.net/doc/2619378572.html,,‟,‟)-1),

phone_number=:new.phone_number,

email=:new.email

where employee_id=:old.emp_id;

end;

instead of trigger 是基于视图建立的, 不能建在表上, 为什么要建在视图上, 一般的视图如果其数据来源一个表并且包含该表的主键, 就可以对视图进行DML 操作. 另外一种情况是从多个表查询出来的. 这样我们就不能对视图进行操作了, 也就是只能查询.instead of trigger 可以解决建在多表上视图的更新操作.

下面我们就来实例操作:

a. 先建表, 简单点就三个分别是学生表, 课程表, 学生选课表

CREA TE TABLE STUDENT

(

CODE V ARCHAR2(5),

LNAME V ARCHAR2(200)

)

CREA TE TABLE COURSE

(

CODE V ARCHAR2(5),

CNAME V ARCHAR2(30)

)

CREA TE TABLE ST_CR

(

STUDENT V ARCHAR2(5),

COURSE V ARCHAR2(5),

GRADE NUMBER

)

-- 表的约束

ALTER TABLE STUDENT ADD CONSTRAINT STUDENT$PK PRIMARY KEY(CODE); ALTER TABLE COURSE ADD CONSTRAINT COURSE$PK PRIMARY KEY(CODE); ALTER TABLE ST_CR ADD CONSTRAINT ST_CR$PK PRIMARY KEY(STUDENT, COURSE);

ALTER TABLE ST_CR ADD CONSTRAINT ST_CR$FK$STUDENT FOREIGN KEY(STUDENT) REFERENCES STUDENT(CODE);

ALTER TABLE ST_CR ADD CONSTRAINT ST_CR$FK$COURSE FOREIGN KEY(COURSE) REFERENCES COURSE(CODE);

b. 基于这三个表的视图

CREA TE OR REPLACE VIEW STUDENT_STA TUS AS

SELECT S.CODE S_CODE, S.LNAME STUDENT, C.CODE C_CODE, https://www.wendangku.net/doc/2619378572.html,AME COURSE, SC.GRADE GRADE

FROM STUDENT S, COURSE C, ST_CR SC

WHERE S.CODE = SC.STUDENT

AND C.CODE = SC.COURSE

c. 基于视图的触发器

CREA TE OR REPLACE TRIGGER TRI_STCR INSTEAD OF INSERT ON STUDENT_STA TUS

FOR EACH ROW

DECLARE

W_ACTION V ARCHAR2(1);

BEGIN

IF INSERTING THEN

W_ACTION := 'I';

ELSE

RAISE PROGRAM_ERROR;

END IF;

INSERT INTO STUDENT(CODE, LNAME) V ALUES(:NEW.S_CODE,:NEW.STUDENT);

INSERT INTO COURSE(CODE, CNAME) V ALUES(:NEW.C_CODE, :NEW.COURSE);

INSERT INTO ST_CR(STUDENT, COURSE, GRADE)

V ALUES(:NEW.S_CODE, :NEW.C_CODE, :NEW.GRADE);

END;

d. 对视图执行数据插入

INSERT INTO STUDENT_STA TUS(S_CODE, STUDENT, C_CODE, COURSE, GRADE)

V ALUES('001','Mike','EN','English',86);

可以看到每个表各有一条数据已经插入.

4 、系统事件触发器

系统事件:数据库启动、关闭,服务器错误

create trigger ad_startup

after startup

on database

begin

-- do some stuff

end;

/

5 、用户事件触发器

用户事件:用户登陆、注销,CREA TE / ALTER / DROP / ANALYZE / AUDIT / GRANT / REVOKE / RENAME / TRUNCA TE / LOGOFF

例子:记录删除对象

1. 日志表

create table droped_objects(

object_name varchar2(30),

object_type varchar2(30),

dropped_on date);

2 .触发器

create or replace trigger log_drop_trigger

before drop on donny.schema

begin

insert into droped_objects values(

ora_dict_obj_name, -- 与触发器相关的函数

ora_dict_obj_type,

sysdate);

end;

/

3. 测试

create table drop_me(a number);

create view drop_me_view as select *from drop_me;

drop view drop_me_view;

drop table drop_me;

select *from droped_objects

禁用和启用触发器

alter trigger disable;

alter trigger enable;

事务处理:

在触发器中,不能使用commit / rollback, 因为ddl 语句具有隐式的commit ,所以也不允许使用

视图:

dba_triggers

MS SQLServer 触发器:

SQL Sever 2005 包含的3 个触发器对象:

AFTER ,数据定义语言(DDL) 和INSTEAD-OF

1.AFTER 触发器是存储程序,它发生于数据操作语句作用之后,例如删除语句等。2.DDL 是SQL Server 2005 的新触发器,允许响应数据库引擎中对象定义水平事件( 例如:DROP TABLE 语句) 。

3.INSTEAD-OF 触发器是对象,在数据库引擎中可以取代数据操作语句而执行。例如: 将INSTEAD-OF INSERT 触发器附加到表,告诉数据库执行此触发器

SQL Server 2005 中DDL 触发器的实现

SQL SERVER 2005 中,新增加了许多新的特性,其中的DDL 触发器是个不错的选择,根据资料初步学习如下,现整理之:

在sql server 2000 中,只能为针对表发出的DML 语句(INSERT 、UPDA TE 和DELETE )定义AFTER 触发器。SQL Server 2005 可以就整个服务器或数据库的某个范围为DDL 事件定义触发器。可以为单个DDL 语句(例如,CREA TE_TABLE )或者为一组语句(例如,DDL_DA TABASE_LEVEL_EVENTS )定义DDL 触发器。在该触发器内部,您可以通过访问eventdata() 函数获得与激发该触发器的事件有关的数据。该函数返回有关事件的XML 数据。每个事件的架构都继承了Server Events 基础架构。

比如,在SQL SERVER 2005 中,建立一个叫DDL TrTest 的数据库,并且建立一个叫mytable 的表和Usp_Querymytable 的存储过程,如下所示

DROP DA TABASE [DDLTRTEST]

GO

CREA TE DA TABASE DDLTRTEST

GO

USE [DDLTRTEST]

GO

IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE OBJECT_ID = OBJECT_ID(N'[DBO].[MYTABLE]') AND TYPE IN (N'U'))

DROP TABLE [DBO].[MYTABLE]

GO

CREA TE TABLE MYTABLE(ID INT, NAME V ARCHAR(100))

GO

INSERT INTO MYTABLE SELECT 1,'A'

INSERT INTO MYTABLE SELECT 2,'B'

INSERT INTO MYTABLE SELECT 3,'C'

INSERT INTO MYTABLE SELECT 4,'D'

INSERT INTO MYTABLE SELECT 5,'E'

INSERT INTO MYTABLE SELECT 6,'F'

GO

USE [DDLTrTest]

GO

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_querymytable]') AND type in (N'P', N'PC'))

DROP PROCEDURE [dbo].[usp_querymytable]

GO

CREA TE PROC USP_QUERYMYTABLE AS SELECT * FROM MYTABLE

GO

接下来定义一个DDL 触发器如下:

CREA TE TRIGGER STOP_DDL_on_Table_and_PROC

ON DA TABASE

FOR

CREA TE_TABLE, DROP_TABLE, ALTER_TABLE,

CREA TE_PROCEDURE, ALTER_PROCEDURE,DROP_PROCEDURE

AS

SELECT EVENTDA TA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(max)')

PRINT 'Y ou are not allowed to CREA TE,ALTER and DROP any Tables and Procedures' ROLLBACK;

接下来,我们尝试如下的操作:

ALTER TABLE MYTABLE ADD X INT

结果如下,出现错误提示

ALTER TABLE MYTABLE ADD X INT

(1 row(s) affected)

Y ou are not allowed to CREA TE,ALTER and DROP any Tables and Procedures

Msg 3609, Level 16, State 2, Line 1

The transaction ended in the trigger. The batch has been aborted.

再执行DROP 的操作,同样触发警告

DROP TABLE MYTABLE

(1 row(s) affected)

Y ou are not allowed to CREA TE,ALTER and DROP any Tables and Procedures

Msg 3609, Level 16, State 2, Line 1

The transaction ended in the trigger. The batch has been aborted.

因为我们的触发器规定了不能使用CREA TE_TABLE,DROP_TABLE, ALTER_TABLE,CREA TE_PROCEDURE,ALTER_PROCEDURE,DROP_PROCEDURE 等操作。

如果我们要关掉这个触发器,可以这样做:

DISABLE TRIGGER STOP_DDL_ON_TABLE_AND_PROC ON DA TABASE

当然,我们要对整个服务器采取策略的话,也是很简单的,和上面的方法大致相同只不过将on database 的参数改为on server, 比如

CREA TE TRIGGER STOP_DDL_on_Table_and_PROC

ON ALL SERVER

FOR

CREA TE_DA TABASE,ALTER_DA TABASE,DROP_DA TABASE

AS

PRINT 'Y ou are not allowed to CREA TE,ALTER and DROP any Databases'

ROLLBACK;

如何使用SQL Server 2005 INSTEAD OF 触发器

触发器是类似于存储程序的数据库对象,它响应数据库环境下的某个请求。SQL Sever 2005 包含 3 个触发器对象:AFTER ,数据定义语言(DDL) 和INSTEAD-OF 。

AFTER 触发器是存储程序,它发生于数据操作语句作用之后,例如删除语句等。DDL 是SQL Server 2005 的新触发器,允许响应数据库引擎中对象定义水平事件(例如:DROP TABLE 语句)。INSTEAD-OF 触发器是对象,在数据库引擎中可以取代数据操作语句而执行。例如:将INSTEAD-OF INSERT 触发器附加到表,告诉数据库执行此触发器。

1. 使用INSTEAD-OF 触发器的理由

INSTEAD-OF 触发器是SQL Sever 功能强大的对象,允许开发人员转移数据库引擎完成不同的工作,以满足开发要求。其中的一个例子是在数据库的表中添加INSTEAD-OF 触发器,当不需要修改表时,可以对表的内容进行回滚。使用此方法时,必须格外小心,因为任何指定的表修改之前,INSTEAD-OF 触发器必须处于激活状态。

使用INSTEAD-OF 触发器一个更充分理由是视图处理。在视图中添加INSTEAD-OF 触发器后,则可创建更新的视图。可更新视图允许完整地提取数据库大纲,因此可以用此方法设计系统,而不需要担心OLTP数据库大纲的问题,并且取代数据修改一组标准视图集。2. 范例

为了更好地说明可更新视图概念,我们提供一个示例。在本例中,我们设计一个产品表(记录产品),一个购买表(记录购买)。Listing A包含了创建表的脚本,运行此脚本后则得到示例中所要用到的表。运行Listing B 脚本向表中添加数据。

现在表中已经有数据了,我可以为这些表创建一些有意义的视图。请查看Listing C 。

这是个典型的产品水平的视图。它联合了数据库中的两个表,使得数据简单化了。但是,对于数据提取,使用视图则没有什么优势。在视图上附上INSTEAD- OF 触发器后,则允许修改表,但是我不需要直接修改表中的数据。我使用Listing D 中的代码在vw_ProductPurchases 视图上创建一个INSTEAD-OF 触发器。

请注意此INSTEAD OF 触发器的声明。SQL Server 创建的默认的触发器为AFTER 触发器,因此,必须在触发器定义中指定INSTEAD OF 子句。

触发器的第一条语句是“check ”语句。本例中我使用此语句检测INSERTED 表以确保显示ProductID 字段,并且保证提供显示其他PurchasePrice 或ProductPrice 字段。

如果必要的数据通过INSERT 语句都插入到视图中,则触发器将插入指定的值到数据表。下面即是视图的INSERT 语句。

INSERT INTO vw_ProductPurchases(ProductID, PurchasePrice) V ALUES(1, 700)

INSERT 语句提供了有效的ProductID 和PurchasePrice ,这意味着新记录插入到Purchases 表

3. 结论

INSTEAD-OF 触发器具有强大的功能和灵活性。如果系统不大,使用视图系统提取数据大纲能够极大保护数据库程序。上面的例子很简单,系统中所用到的复杂的触发器需要考虑安全性问题、时间开销和其他限制。

MSSQLServer 触发器介绍:

触发器实际上就是一种特殊类型的存储过程,其特殊性表现在:它是在执行某些特定的T-SQL 语句时自动的。

11.1 触发器简介

触发器实际上就是一种特殊类型的存储过程,它是在执行某些特定的T-SQL 语句时自动执行的一种存储过程。在SQL Server 2005 中,根据SQL 语句的不同,把触发器分为两类:一类是DML 触发器,一类是DLL 触发器。

11.1.1 触发器的概念和作用

在SQL Server 2005 里,可以用两种方法来保证数据的有效性和完整性:约束(check )和触发器(Trigger )。约束是直接设置于数据表内,只能现实一些比较简单的功能操作,如:实现字段有效性和唯一性的检查、自动填入默认值、确保字段数据不重复(即主键)、确保数据表对应的完整性(即外键)等功能。

触发器是针对数据表(库)的特殊的存储过程,当这个表发生了Insert 、Update 或Delete 操作时,会自动激活执行的,可以处理各种复杂的操作。在SQL Server 2005 中,触发器有了更进一步的功能,在数据表(库)发生Create 、Alter 和Drop 操作时,也会自动激活执行。

触发器常用的一些功能如下:

l 完成比约束更复杂的数据约束:触发器可以实现比约束更为复杂的数据约束

l 检查所做的SQL 是否允许:触发器可以检查SQL 所做的操作是否被允许。例如:在产品库存表里,如果要删除一条产品记录,在删除记录时,触发器可以检查该产品库存数量是否为零,如果不为零则取消该删除操作。

l 修改其它数据表里的数据:当一个SQL 语句对数据表进行操作的时候,触发器可以根据该SQL 语句的操作情况来对另一个数据表进行操作。例如:一个订单取消的时候,那么触发器可以自动修改产品库存表,在订购量的字段上减去被取消订单的订购数量。

l 调用更多的存储过程:约束的本身是不能调用存储过程的,但是触发器本身就是一种存储过程,而存储过程是可以嵌套使用的,所以触发器也可以调用一个或多过存储过程。

l 发送SQL Mail :在SQL 语句执行完之后,触发器可以判断更改过的记录是否达到一定条件,如果达到这个条件的话,触发器可以自动调用SQL Mail 来发送邮件。例如:当一个订单交费之后,可以物流人员发送Email ,通知他尽快发货。

l 返回自定义的错误信息:约束是不能返回信息的,而触发器可以。例如插入一条重复记录时,可以返回一个具体的友好的错误信息给前台应用程序。

l 更改原本要操作的SQL 语句:触发器可以修改原本要操作的SQL 语句,例如原本的SQL 语句是要删除数据表里的记录,但该数据表里的记录是最要记录,不允许删除的,那么触发器可以不执行该语句。

l 防止数据表构结更改或数据表被删除:为了保护已经建好的数据表,触发器可以在接收到Drop 和Alter 开头的SQL 语句里,不进行对数据表的操作。

11.1.2 触发器的种类

在SQL Server 2005 中,触发器可以分为两大类:DML 触发器和DDL 触发器

l DML 触发器:DML 触发器是当数据库服务器中发生数据操作语言(Data Manipulation Language )事件时执行的存储过程。DML 触发器又分为两类:After 触发器和Instead Of 触发器

l DDL 触发器:DDL 触发器是在响应数据定义语言(Data Definition Language )事件时执行的存储过程。DDL 触发器一般用于执行数据库中管理任务。如审核和规范数据库操作、防止数据库表结构被修改等。

11.2 DML 触发器的分类

SQL Server 2005 的DML 触发器分为两类:

l After 触发器:这类触发器是在记录已经改变完之后(after ),才会被激活执行,它主要是用于记录变更后的处理或检查,一旦发现错误,也可以用Rollback Transaction 语句来回滚本次的操作。

l Instead Of 触发器:这类触发器一般是用来取代原本的操作,在记录变更之前发生的,它并不去执行原来SQL 语句里的操作(Insert 、Update 、Delete ),而去执行触发器本身所定义的操作。

11.3 DML 触发器的工作原理

在SQL Server 2005 里,为每个DML 触发器都定义了两个特殊的表,一个是插入表,一个是删除表。这两个表是建在数据库服务器的内存中的,是由系统管理的逻辑表,而不是真正存储在数据库中的物理表。对于这两个表,用户只有读取的权限,没有修改的权限。

这两个表的结构与触发器所在数据表的结构是完全一致的,当触发器的工作完成之后,这两个表也将会从内存中删除。

插入表里存放的是更新前的记录:对于插入记录操作来说,插入表里存放的是要插入的数据;对于更新记录操作来说,插入表里存放的是要更新的记录。

删除表里存放的是更新后的记录:对于更新记录操作来说,删除表里存放的是更新前的记录(更新完后即被删除);对于删除记录操作来说,删除表里存入的是被删除的旧记录。

下面看一下触发器的工作原理。

11.3.1 After 触发器的工作原理

After 触发器是在记录更变完之后才被激活执行的。以删除记录为例:当SQL Server 接收到一个要执行删除操作的SQL 语句时,SQL Server 先将要删除的记录存放在删除表里,然后把数据表里的记录删除,再激活After 触发器,执行After 触发器里的SQL 语句。执行完毕之后,删除内存中的删除表,退出整个操作。

还是举上面的例子:在产品库存表里,如果要删除一条产品记录,在删除记录时,触发器可以检查该产品库存数量是否为零,如果不为零则取消删除操作。看一下数据库是怎么操作的:( 1 )接收SQL 语句,将要从产品库存表里删除的产品记录取出来,放在删除表里。( 2 )从产品库存表里删除该产品记录。

( 3 )从删除表里读出该产品的库存数量字段,判断是不是为零,如果为零的话,完成操作,从内存里清除删除表;如果不为零的话,用Rollback Transaction 语句来回滚操作。11.3.2 Instead Of 触发器的工作原理

Instead Of 触发器与After 触发器不同。After 触发器是在Insert 、Update 和Delete 操作完成后才激活的,而Instead Of 触发器,是在这些操作进行之前就激活了,并且不再去执行原来的SQL 操作,而去运行触发器本身的SQL 语句。

11.4 设计DML 触发器的注意事项及技巧

在了解触发器的种类和工作理由之后,现在可以开始动手来设计触发器了,不过在动手之前,还有一些注意事项必须先了解一下:

11.4.1 设计触发器的限制

在触发器中,有一些SQL 语句是不能使用的,这些语句包括:

发器里再使用这些语句:

表11.2 在目标表中使用过的,DML 触发器不能再使用的语句

上面介绍过,SQL Server 2005 在为每个触发器都定义了两个虚拟表,一个是插入表(inserted ),一个是删除表(deleted ),现在把这两个表存放的数据列表说明一下:

以上面删除库存产品记录为例,在删除时触发器要判断库存数量是否为零,那么判断就应该这么写:

If (Select 库存数量From Deleted)>0

Begin

Print … 库存数量大于零时不能删除此记录‟

Rollback Transaction

End

11.4.3 其他注意事项

l l After 触发器只能用于数据表中,Instead Of 触发器可以用于数据表和视图上,但两种触发器都不可以建立在临时表上。

l l 一个数据表可以有多个触发器,但是一个触发器只能对应一个表。

l l 在同一个数据表中,对每个操作(如Insert 、Update 、Delete )而言可以建立许多个After 触发器,但Instead Of 触发器针对每个操作只有建立一个。

l l 如果针对某个操作即设置了After 触发器又设置了Instead Of 触发器,那么Instead of 触发器一定会激活,而After 触发器就不一定会激活了。

l l Truncate Table 语句虽然类似于Delete 语句可以删除记录,但是它不能激活Delete

类型的触发器。因为Truncate Table 语句是不记入日志的。

l l WRITETEXT 语句不能触发Insert 和Update 型的触发器。

l l 不同的SQL 语句,可以触发同一个触发器,如Insert 和Update 语句都可以激活同一个触发器。

11.5 设计After 触发器

在了解触发器及其种类、作用、工作原理之后,下面详细讲述一下要怎么去设计及建立触发器。

11.5.1 设计简单的After 触发器

下面用实例设计一个简单的After Insert 触发器,这个触发器的作用是:在插入一条记录的时候,发出“ 又添加了一种产品” 的友好提示。

( 1 )启动Management Studio ,登录到指定的服务器上。

( 2 )在如图11.1 所示界面的【对象资源管理器】下选择【数据库】,定位到【Northwind 】数据库à【表】à【dbo. 产品】,并找到【触发器】项。

图11.1 定位到触发器

( 3 )右击【触发器】,在弹出的快捷菜单中选择【新建触发器】选项,此时会自动弹出【查询编辑器】对话框,在【查询编辑器】的编辑区里SQL Server 已经预写入了一些建立触发器相关的SQL 语句,如图11.2 所示。

图11.2 SQL Server 2005 预写的触发器代码

( 4 )修改【查询编辑器】里的代码,将从“CREA TE” 开始到“GO” 结束的代码改为以下代码:

CREA TE TRIGGER 产品_Insert

ON 产品

AFTER INSERT

AS

BEGIN

print ' 又添加了一种产品'

END

GO

如果有兴趣的话,也可以去修改一下如图11.2 中绿色部分的版权信息。

( 5 )单击工具栏中的【分析】按钮,检查一下是否语法有错,如图11.3 所示,如果在下面的【结果】对话框中出现“ 命令已成功完成” ,则表示语法没有错误。

图11.3 检查语法

( 6 )语法检查无误后,单击【执行】按钮,生成触发器。

(7 )关掉查询编辑器对话框,刷新一下触发器对话框,可以看到刚才建立的【产品_Insert 】触发器,如图11.4 所示。

图11.4 建好的触发器

建立After Update 触发器、After Delete 触发器和建立After Insert 触发器的步骤一致,不同的地方是把上面的SQL 语句中的AFTER INSERT 分别改为AFTER UPDA TE 和AFTER DELETE 即可,如下所示,有兴趣的读者可以自行测试。

CREA TE TRIGGER 产品_Update

ON 产品

AFTER UPDA TE

AS

BEGIN

print ' 有一种产品更改了'

END

GO

CREA TE TRIGGER 产品_Delete

ON 产品

AFTER DELETE

AS

BEGIN

print ' 又删除了一种产品'

END

GO

11.5.2 测试触发器功能

建好After Insert 触发器之后,现在来测试一下触发器是怎么样被激活的。

( 1 )在Management Studio 里新建一个查询,在弹出的【查询编辑器】对话框里输入以下代码:

INSERT INTO 产品( 产品名称) V ALUES (' 大苹果')

( 2 )单击【执行】按钮,可以看到【消息】对话框里显示出一句提示:“ 又添加了一种产品” ,如图11.5 所示,这说明,After Insert 触发器被激活,并运行成功了。

图11.5 查看触发器的运行结果

而如果在【查询编辑器】里执行的不是一个Insert 语句,而是一个Delete 语句的话,After Insert 触发器将不会被激活。如在【查询编辑器】输入以下语句:

DELETE FROM 产品WHERE ( 产品名称= ' 大苹果')

单击【执行】按钮,在【消息】对话框里只显示了一句“(1 行受影响)” 的提示,而没有“ 又添加了一种产品” 的提示,如图11.6 所示。这是因为Delete 语句是不能激活After Insert 触发器,所以After Insert 触发器里的“print … 又添加了一种产品‟” 语句并没有执行。

图11.6 执行删除语句不会激活After Insert 触发器

11.5.3 建立触发器的SQL 语句

回顾一下,在Management Studio 新建一个触发器的时候,它在查询分析对话框给预设了一些SQL 代码,这些代码其实上就是建立触发器的语法提示。现在来看一下完整的触发器语法代码:

CREA TE TRIGGER .

ON . AFTER

AS

BEGIN

-- SET NOCOUNT ON added to prevent extra result sets from

-- interfering with SELECT statements.

SET NOCOUNT ON;

-- Insert statements for trigger here

END

GO

用中文改了一下,以上代码就一目了然了:

CREA TE TRIGGER 触发器名

ON 数据表名或视图名

AFTER INSERT 或DELETE 或UPDA TE

AS

BEGIN

-- 这里是要运行的SQL 语句

END

GO

现在再对上面的代码进行进一步的说明:

l l CREA TE TRIGGER 触发器名:这一句声明SQL 语句是用来建立一个触发器。其中触发器名在所在的数据库里必须是唯一的。由于触发器是建立中数据表或视图中的,所以有很多人都以为只要是在不同的数据表中,触发器的名称就可以相同,其实触发器的全名(Server.Database.Owner.TriggerName )是必须唯一的,这与触发器在哪个数据表或视图无关。

l l ON 数据表名或视图名:这是指定触发器所在的数据表或视图,但是请注意,只有Instead Of 触发器才能建立在视图上。并且,有设置为With Check Option 的视图也不允许建立Instead Of 触发器。

l l AFTER INSERT 或DELETE UPDA TE :这是指定触发器的类型,是After Insert 触发器,还是After Delete 触发器,或者是After Update 触发器。其中After 可以用For 来代取,它们的意思都是一样的,代表只有在数据表的操作都已正确完成后才会激活的触发器。INSERT 、DELETE 和UPDA TE 至少要指定一个,当然也可以指定多个,若指定多个时,必须用逗号来分开。其顺序可以任意摆放。

l l With Encryption :With Encryption 是用来加密触发器的,放在“On 数据表名或视图名” 的后面,“For” 的前面。如果使用了这句话,该触发器将会被加密,任何人都看不到触发器的内容了。

例一:以下是一个包含提醒电子邮件的触发器例子,如果订单表里记录有改动的的话(无论增加订单还是修改、删除订单),则给物流人员张三发送电子邮件:

CREA TE TRIGGER 订单_Insert

ON 订单

AFTER INSERT, UPDA TE, DELETE

AS

EXEC master..xp_sendmail ' 张三',

' 订单有更改,请查询确定'

GO

例二:在订单明细表里,折扣字段不能大于0.6 ,如果插入记录时,折扣大于0.6 的话,回滚操作。

CREA TE TRIGGER 订单明细_Insert

ON 订单明细

AFTER INSERT

AS

BEGIN

if (Select 折扣from inserted)>0.6

begin

print ' 折扣不能大于0.6'

Rollback Transaction

end

END

GO

在示例二中运用了两个方法,一个是前面说过的,在Inserted 表里查询某个字段,还有一个是用Rollback Transaction 来回滚操作。如果用下面的SQL 语句来进行Insert 操作的

sql中触发器相关用法

sql中触发器相关用法 SQL中的触发器是一种特殊的存储过程,它会在特定的数据库操作(如插入、更新、删除)发生时自动执行。触发器可以用来维护数据的完整性、实现业务规则、日志记录等。下面我将从触发器的创建、类型、语法和示例等方面介绍相关用法。 1. 创建触发器: 在SQL中,可以使用CREATE TRIGGER语句来创建触发器。语法通常如下: sql. CREATE TRIGGER trigger_name. {BEFORE | AFTER} {INSERT | UPDATE | DELETE}。 ON table_name. FOR EACH ROW.

BEGIN. -触发器执行的操作。 END; 在这个语法中,trigger_name是触发器的名称,BEFORE或AFTER表示触发的时间点,INSERT、UPDATE、DELETE表示触发的操作,table_name是触发器所在的表,FOR EACH ROW表示每行触发。 2. 触发器类型: BEFORE触发器,在触发操作执行之前触发,可以用来进行数据验证或修改。 AFTER触发器,在触发操作执行之后触发,可以用来记录日志或执行其他后续操作。 3. 触发器语法: 触发器的语法包括触发时机(BEFORE或AFTER)、触发的操

作(INSERT、UPDATE、DELETE)、触发的表和触发器执行的操作。在BEGIN和END之间编写触发器的具体逻辑,可以是SQL语句或调用存储过程。 4. 触发器示例: 下面是一个简单的触发器示例,当在表中插入新记录时,自动更新另一张表的相关数据: sql. CREATE TRIGGER update_other_table. AFTER INSERT. ON main_table. FOR EACH ROW. BEGIN. UPDATE other_table.

简单使用触发器SQL触发器的使用及语法

简单使用触发器SQL触发器的使用及语法SQL触发器是一种特殊类型的存储过程,它是在数据库中一些特定的操作发生时自动执行的。触发器可以用于在数据被插入、更新或删除时执行一系列的操作。本文将详细介绍SQL触发器的使用和语法。 1.触发器的类型: SQL触发器可以分为三种类型:插入触发器(INSERT trigger)、更新触发器(UPDATE trigger)和删除触发器(DELETE trigger)。根据业务需求选择相应的触发器类型。 2.创建触发器: 创建触发器需要使用CREATETRIGGER语句。语法如下: CREATE TRIGGER {BEFORE,AFTER,INSTEADOF}{INSERT,UPDATE,DELETE} [ON ] [FOREACHROW] [WHEN ()] BEGIN --触发器执行的操作 END; 其中,trigger_name是触发器的名称;BEFORE / AFTER / INSTEAD OF表示触发器在所指定操作之前、之后或者代替进行;INSERT / UPDATE

/ DELETE表示触发器响应的操作类型;table_name是触发器所绑定的表名;FOR EACH ROW表示该触发器对每一行数据都执行;condition是触发器的条件。 3.触发器执行的操作: 在触发器的BEGIN和END之间,可以进行一系列的操作,如执行SQL 语句、调用存储过程等。可以根据业务需求在触发器中编写逻辑代码来满足需求。 4.触发器的应用场景: -数据完整性:可以使用触发器在插入、更新或删除数据时进行一些验证,确保数据的完整性。例如,在插入新用户之前,可以在触发器中检查用户的必填字段是否为空。 -数据同步:可以使用触发器在数据更新时自动更新其他相关表中的数据,确保数据的同步。例如,在更新订单信息时,可以在触发器中更新库存表中的相应数据。 -数据审计:可以使用触发器在数据插入、更新或删除时自动记录相关操作日志,用于审计或追踪。例如,在删除客户信息时,可以在触发器中记录删除操作的时间和用户信息。 5.触发器的管理: 可以使用ALTER TRIGGER语句修改已存在的触发器,使用DROP TRIGGER语句删除触发器。可以通过查询系统目录表(如sys.triggers)或使用特定的数据库管理工具来查看和管理数据库中的触发器。 总结:

触发器逻辑功能的几种方法

触发器逻辑功能的几种方法 触发器是一种数据库对象,它可以在数据修改时自动执行指定的操作。触发器的逻辑功能可以通过多种方法来实现。下面将介绍几种常用的方法。 1. 使用SQL语句实现逻辑功能 使用SQL语句可以实现触发器的逻辑功能。在触发器中可以使用 INSERT、UPDATE、DELETE 语句来对其他表或触发器中的数据进行操作。 例如,可以创建一个触发器,在插入一条新记录时,自动将记录的信息插入到另一个表中。具体实现如下: CREATE TRIGGER `insert_trigger` AFTER INSERT ON `table1` FOR EACH ROW BEGIN INSERT INTO `table2`(`col1`, `col2`) VALUES (NEW.`col1`, NEW.`col2`); END; 上述代码中,insert_trigger 是触发器的名称,table1 和 table2 是两个表的名称。当在 table1 中插入一条记录时,触发器会自动将这条记录的 col1 和 col2 列的值插入到 table2 中。 2. 使用存储过程实现逻辑功能 存储过程是一种预先编译的SQL语句集合,可以在需要时直接调用。使用存储过程也可以实现触发器的逻辑功能。 例如,可以创建一个存储过程,完成将记录的信息插入到另一

个表的操作。具体实现如下: CREATE PROCEDURE `insert_procedure`(IN `col1_value` INT, IN `col2_value` VARCHAR(50)) BEGIN INSERT INTO `table2`(`col1`, `col2`) VALUES (`col1_value`, `col2_value`); END; 上述代码中,insert_procedure 是存储过程的名称,table2 是目标表的名称。当需要将一条记录的信息插入到 table2 中时,可以调用此存储过程,将需要插入的值作为参数传递进去。 3. 使用函数实现逻辑功能 函数也可以用来实现触发器的逻辑功能。在函数中可以使用INSERT、UPDATE、DELETE 语句来对其他表或触发器中的数据进行操作。 例如,可以创建一个函数,完成将记录的信息插入到另一个表的操作。具体实现如下: CREATE FUNCTION `insert_function`(`col1_value` INT, `col2_value` VARCHAR(50)) RETURNS INT BEGIN DECLARE result INT; INSERT INTO `table2`(`col1`, `col2`) VALUES (`col1_value`, `col2_value`); SELECT LAST_INSERT_ID() INTO result; RETURN result; END; 上述代码中,insert_function 是函数的名称,table2 是目标表的名称。当需要将一条记录的信息插入到 table2 中时,可以调用此函数,将需要插入的值作为参数传递进去。函数在执行完成

sql 触发器语法

sql 触发器语法 一、什么是 SQL 触发器? SQL 触发器是一种特殊的存储过程,它在特定的数据库操作(如INSERT、UPDATE 或DELETE)执行时自动触发。当满足特定条件时,触发器可以在表上执行操作或调用其他存储过程。 二、SQL 触发器的语法 SQL 触发器的语法如下: CREATE TRIGGER trigger_name {BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name [FOR EACH ROW] BEGIN -- 触发器执行的 SQL 语句 END; 其中: - trigger_name:触发器名称,用户自定义。 - BEFORE/AFTER:指定触发时间,即在数据库操作之前或之后执行。- INSERT/UPDATE/DELETE:指定触发事件,即在进行插入、更新或删除操作时执行。

- table_name:指定要监视的表名。 - FOR EACH ROW:可选参数,表示为每一行数据都会执行此触发器。- BEGIN 和 END:包含了要执行的 SQL 语句。 三、SQL 触发器示例 1. 创建一个在插入数据时自动更新修改日期的触发器: CREATE TRIGGER update_date BEFORE INSERT ON users FOR EACH ROW BEGIN SET NEW.modify_date = NOW(); END; 2. 创建一个在删除订单时自动将订单中商品数量归零的触发器: CREATE TRIGGER reset_quantity AFTER DELETE ON orders FOR EACH ROW BEGIN UPDATE products SET quantity = 0 WHERE product_id = OLD.product_id; END;

触发器基本语法

触发器基本语法 触发器是一种在特定条件下自动执行某种操作的数据库对象。它 是数据库管理系统中非常有用的功能,可以实现许多复杂的业务逻辑。触发器主要由事件、条件和动作组成。本文将详细介绍触发器的基本 语法,并提供一些使用触发器的指导意义。 首先,触发器的事件指的是触发触发器执行的数据库操作。常见 的事件有插入(INSERT)、更新(UPDATE)和删除(DELETE)。在定 义触发器时,我们需要指定触发器所关联的表以及触发的事件。例如,如果我们希望在某个表的插入操作触发触发器,可以使用如下语法:CREATE TRIGGER 触发器名称 ON 表名 FOR INSERT 接着,触发器的条件用于确定是否要执行触发器的动作。条件通 常基于表中的数据,并使用一些条件表达式进行判断。例如,我们可 以使用IF语句来定义触发器的条件。以下是一个使用条件的触发器语 法示例: CREATE TRIGGER 触发器名称 ON 表名 FOR INSERT

AS IF 条件表达式 BEGIN --触发器动作 END 最后,触发器的动作是在满足条件时执行的语句或语句块。触发 器的动作可以是任何合法的T-SQL语句,比如插入、更新或删除数据。例如,以下是一个触发器的动作语法示例: CREATE TRIGGER 触发器名称 ON 表名 FOR INSERT AS IF 条件表达式 BEGIN --触发器动作 INSERT INTO 其他表名 (列1, 列2, 列3) VALUES (值1, 值2, 值3) END

触发器可以帮助我们实现许多复杂的业务逻辑。例如,我们可以使用触发器来自动计算某个字段的值,或者在数据变化时记录日志。触发器还可以用于实现数据一致性约束,例如,当删除某个表中的数据时,可以使用触发器来阻止删除操作,从而保证数据的完整性。 在使用触发器时,我们需要注意一些事项。首先,触发器的执行是自动的,无法手动调用。其次,触发器会在主动操作之前或之后触发,具体取决于我们定义触发器时的设置。最后,触发器可能会对数据库的性能产生一定的影响,特别是在处理大量数据时。因此,我们需要合理使用触发器,避免过度使用或定义复杂的逻辑。 综上所述,触发器是数据库管理系统中非常有用的功能,可以帮助我们实现复杂的业务逻辑和数据一致性约束。了解触发器的基本语法以及如何使用触发器,有助于我们更好地利用数据库的功能,提高数据的准确性和一致性。

sql server触发器的基本语法和使用方法

sql server触发器的基本语法和使用方法 一、引言 SQL Server触发器是一种数据库对象,它在数据库表上定义在特定事件发生时自动执行的操作。触发器基于定义的事件和条件进行触发,并执行一系列预定的操作。本文将介绍SQL Server触发器的基本语法和使用方法,帮助您更好地理解和应用触发器。 二、触发器的语法 触发器的语法主要由以下几个部分组成: 1. 触发器名称:指定触发器的名称,以便在创建触发器时进行命名和识别。 2. 触发器事件:指定触发器应何时触发,常见的触发器事件包括INSERT、UPDATE和DELETE等。 3. 触发器模式:指定触发器在事件发生时执行的操作,包括对表数据的插入、更新和删除等操作。 4. 触发器所在的架构:指定触发器所在的架构,以便在创建触发器时指定正确的架构。 基本语法示例: CREATE TRIGGER trigger_name ON table_name FOR INSERT, UPDATE, DELETE AS BEGIN -- 触发器操作代码 END; 三、触发器的使用方法 1. 创建触发器:使用CREATE TRIGGER语句创建触发器,指定触发器的名称、事件、模式和所在的架构。 2. 禁用和启用触发器:使用ALTER TRIGGER语句来禁用和启用触发器,以满足特定需求或临时更改触发器的行为。

3. 修改触发器:使用ALTER TRIGGER语句修改现有触发器的名称、事件、模式和位置等属性。 4. 删除触发器:使用DROP TRIGGER语句删除不再需要的触发器。 5. 触发器的嵌套:在触发器内部可以定义其他触发器,形成嵌套结构,实现更复杂的逻辑。 6. 触发器的权限:确保创建、修改和删除触发器的用户具有足够的权限。 7. 异常处理:在触发器操作代码中添加适当的异常处理机制,以应对可能出现的错误和异常情况。 四、示例 以下是一个简单的示例,展示如何使用SQL Server触发器在表上定义一个插入操作时自动添加日志: 1. 创建表:首先创建一个包含要记录的字段的表。 2. 创建触发器:使用CREATE TRIGGER语句创建触发器,指定事件为INSERT,模式为插入时记录日志。 3. 插入数据:测试插入数据,查看日志记录是否正确生成。 通过以上示例,您可以了解如何使用SQL Server触发器的基本语法和使用方法,以及如何在特定事件发生时自动执行相应的操作。在实际应用中,根据具体需求灵活运用触发器,以提高数据库管理和维护的效率和准确性。

plsql触发器写法

plsql触发器写法 PL/SQL触发器是一种特殊的存储过程,它在数据库中的表上自动执行。当在表上执行特定的操作时,触发器会自动触发并执行相应的代码。下面是PL/SQL触发器的详细创作步骤: 1. 创建触发器 使用CREATE TRIGGER语句创建触发器。语法如下: CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name [FOR EACH ROW] [WHEN condition] DECLARE -- 触发器代码 BEGIN -- 触发器代码 END; 其中,trigger_name是触发器的名称,table_name是触发器所在的表名,BEFORE 或AFTER指定触发器在执行操作之前或之后执行,INSERT、UPDATE或DELETE 指定触发器在执行相应操作时触发,FOR EACH ROW指定触发器对每一行数据都执行,WHEN condition是可选的,用于指定触发器执行的条件。 2. 编写触发器代码 在DECLARE和BEGIN-END之间编写触发器代码。触发器代码可以包括PL/SQL

语句、SQL语句和存储过程调用等。例如,以下是一个简单的触发器代码,用于在插入数据时自动更新另一个表的数据: DECLARE v_count NUMBER; BEGIN SELECT COUNT(*) INTO v_count FROM table_name; UPDATE other_table SET count = v_count; END; 3. 测试触发器 在表上执行相应的操作,触发器会自动执行相应的代码。可以使用SELECT语句检查触发器是否按预期工作。 4. 修改或删除触发器 可以使用ALTER TRIGGER语句修改触发器,使用DROP TRIGGER语句删除触发器。例如,以下是修改触发器的语法: ALTER TRIGGER trigger_name {ENABLE | DISABLE}; 其中,ENABLE或DISABLE用于启用或禁用触发器。 总之,PL/SQL触发器是一种强大的数据库工具,可以自动执行代码,提高数据库的效率和可靠性。在编写触发器时,需要仔细考虑触发器的目的和执行条件,以确保触发器按预期工作。

创建触发器sql语句简单例子

创建触发器sql语句简单例子 在数据库中,触发器是一种特殊的存储过程,它在指定的数据库操作(如插入、更新或删除)发生时自动执行。触发器可以用于实现数据一致性、完整性以及其他业务逻辑的需求。本文将介绍创建触发器的SQL语句的简单例子。 在创建触发器之前,我们首先需要明确触发器要针对的表以及触发的事件类型(如插入、更新或删除)。我们以一个简单的示例来说明,假设有两个表: `Customers`(顾客表)和`Orders`(订单表),并且要在`Orders`表中插入一条新记 录时,在`Customers`表中自动更新顾客的订单数量。 以下是创建触发器的SQL语句的简单例子: ```sql CREATE TRIGGER update_order_count AFTER INSERT ON Orders FOR EACH ROW BEGIN UPDATE Customers SET order_count = order_count + 1 WHERE customer_id = NEW.customer_id; END; ``` 解释一下上述SQL语句的具体含义:

- `CREATE TRIGGER update_order_count`:创建一个名为`update_order_count`的触发器; - `AFTER INSERT ON Orders`:定义触发器在`Orders`表中插入记录后触发; - `FOR EACH ROW`:指定触发器对每一行的记录执行; - `BEGIN`和`END`之间的代码块:触发器的具体逻辑代码; - `UPDATE Customers SET order_count = order_count + 1 WHERE customer_id = NEW.customer_id;`:在触发器中执行的SQL语句,更新`Customers`表中符合条件的记录。 在上述例子中,每当在`Orders`表中插入一条新记录时,触发器会自动执行,将对应顾客的订单数量加1,并更新到`Customers`表中。 需要注意的是,触发器可以在数据库的执行路径上引入额外的开销。因此,在使用触发器时,需要慎重考虑其对数据库性能的影响,并确保触发器的逻辑是必需的。 总结而言,触发器是一种强大的数据库工具,可以用于实现复杂的业务逻辑。通过以上SQL语句的简单例子,我们可以了解到如何创建一个基本的触发器,并在特定的数据库操作发生时自动触发相应的逻辑。

sql触发器 条件 语句

sql触发器条件语句 SQL触发器是一种特殊的存储过程,它可以在数据库中的表上自动执行某些操作。当满足特定条件时,触发器会自动触发并执行相应的操作。在本文中,我们将讨论SQL触发器的条件语句,并列举一些符合标题内容的例子。 1. 在插入数据时触发器 当向数据库中的表插入新数据时,可以使用触发器来自动执行某些操作。例如,可以在插入新数据时自动计算某些值或更新其他表中的数据。 2. 在更新数据时触发器 当更新数据库中的表时,可以使用触发器来自动执行某些操作。例如,可以在更新数据时自动计算某些值或更新其他表中的数据。 3. 在删除数据时触发器 当从数据库中的表中删除数据时,可以使用触发器来自动执行某些操作。例如,可以在删除数据时自动更新其他表中的数据或记录删除操作的日志。 4. 在数据插入、更新或删除时触发器 可以使用触发器来在数据插入、更新或删除时自动执行某些操作。

例如,可以在数据插入、更新或删除时自动计算某些值或更新其他表中的数据。 5. 在特定条件下触发器 可以使用触发器来在特定条件下自动执行某些操作。例如,可以在某个字段的值等于特定值时触发器自动执行某些操作。 6. 在特定时间触发器 可以使用触发器来在特定时间自动执行某些操作。例如,可以在每天的特定时间自动执行某些操作。 7. 在特定事件触发器 可以使用触发器来在特定事件发生时自动执行某些操作。例如,可以在某个用户登录时自动执行某些操作。 8. 在特定用户操作时触发器 可以使用触发器来在特定用户操作时自动执行某些操作。例如,可以在某个用户执行特定操作时自动执行某些操作。 9. 在特定数据状态下触发器 可以使用触发器来在特定数据状态下自动执行某些操作。例如,可以在某个字段的值等于特定值时自动执行某些操作。

sqlserver 触发器if else语句

sqlserver 触发器if else语句 在SQLServer中,触发器是一种特殊的存储过程,它们在数据库中的表上自动执行,通常用于在表上进行特定操作时执行其他操作。在触发器中,可以使用 IF ELSE 语句以根据条件执行不同的操作。 以下是一个示例触发器,其中包含 IF ELSE 语句: CREATE TRIGGER [dbo].[trig_example] ON [dbo].[example_table] AFTER INSERT, UPDATE, DELETE AS BEGIN -- Check if INSERT IF EXISTS (SELECT * FROM inserted) BEGIN PRINT 'New rows added' -- Insert additional data into another table INSERT INTO [dbo].[additional_table] (column1, column2) SELECT column3, column4 FROM inserted END -- Check if UPDATE ELSE IF EXISTS (SELECT * FROM deleted) BEGIN PRINT 'Rows updated'

-- Update data in another table UPDATE [dbo].[additional_table] SET column1 = inserted.column3 FROM [dbo].[additional_table] INNER JOIN inserted ON inserted.id = [dbo].[additional_table].id END -- Check if DELETE ELSE BEGIN PRINT 'Rows deleted' -- Delete data from another table DELETE FROM [dbo].[additional_table] WHERE id IN (SELECT id FROM deleted) END END 该触发器在 example_table 上创建,并根据 INSERT、UPDATE 和DELETE 操作执行不同的操作。在 INSERT 操作中,它将从 inserted 表中选择数据并将其插入到 additional_table 中。在 UPDATE 操作中,它将使用 INNER JOIN 从 inserted 表中选择数据,并将其更新到 additional_table。在 DELETE 操作中,它将从 deleted 表中选择数据,并将其从 additional_table 中删除。

sql查询触发器语句

sql查询触发器语句 SQL触发器是一种特殊的数据库对象,它可以在特定的数据库操作(例如插入、更新、删除)发生时自动执行一些预定义的动作。触发器可以用于实现复杂的业务逻辑和数据完整性约束。下面列举了10个常见的SQL触发器语句: 1. 在员工表上创建触发器,当有新员工加入时,自动在工资表中插入一条新记录: ```sql CREATE TRIGGER insert_employee AFTER INSERT ON employees FOR EACH ROW BEGIN INSERT INTO salaries (employee_id, salary) VALUES (NEW.employee_id, 0); END; ``` 2. 在订单表上创建触发器,当订单状态更新为已发货时,自动更新库存表中对应商品的数量: ```sql CREATE TRIGGER update_inventory AFTER UPDATE ON orders

FOR EACH ROW BEGIN IF NEW.status = '已发货' THEN UPDATE inventory SET quantity = quantity - NEW.quantity WHERE product_id = NEW.product_id; END IF; END; ``` 3. 在学生表上创建触发器,当有新学生加入时,自动更新班级表中的学生人数: ```sql CREATE TRIGGER update_class_size AFTER INSERT ON students FOR EACH ROW BEGIN UPDATE classes SET size = size + 1 WHERE class_id = NEW.class_id; END; ``` 4. 在商品表上创建触发器,当商品数量低于阈值时,自动发送库存警报邮件:

创建触发器sql语句简单例子

创建触发器sql语句简单例子 创建触发器是在数据库中定义的一种特殊的存储过程,其会在表之间的数据插入、更新或删除操作发生时自动触发执行。触发器通常用于实施数据一致性约束规则、备份操作或记录日志等。 触发器的创建语法如下: ``` CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name [FOR EACH ROW] [trigger_body] ``` 其中,触发器的名字(trigger_name)是必需的,用于在以后的操作中引用该触发器。触发时间(trigger_time)可以选择为BEFORE或AFTER,表示在进行INSERT、UPDATE或DELETE操作之前或之后触发。触发事件(trigger_event)可以是INSERT、UPDATE或DELETE,表示在执行这些操作时触发。表名(table_name)是触发器所绑定的表名,可以是一个或多个表,用逗号分隔。对于每一行的操作,可以使用FOR EACH ROW语句来指定。最后,触发器的主体 (trigger_body)是由一系列SQL语句构成的,这些语句将在触发时执行。 以下是一个简单的例子,以说明如何在触发器中实现特定的功能: ```

-- 创建一个触发器,当插入新的订单记录时自动更新订单总金额 CREATE TRIGGER update_order_total AFTER INSERT ON orders FOR EACH ROW BEGIN UPDATE orders SET total_amount = ( SELECT SUM(price) FROM order_items WHERE order_id = NEW.order_id ) WHERE order_id = NEW.order_id; END; ``` 该触发器名为update_order_total,触发时间为AFTER,触发 事件为INSERT,绑定的表为orders。当插入新的订单记录时,触发器的主体会执行UPDATE语句,根据订单号更新订单总 金额。SQL语句中的NEW表示正在被插入的新行。 触发器的创建主要涉及触发器的语法和具体逻辑的实现。在实际使用中,可以根据具体的需求来创建相关的触发器。以下是一些创建触发器时的注意事项和参考内容: 1. 确定触发的时机和事件:根据需求确定触发器的触发时间和触发事件,可以是在插入、更新或删除操作之前或之后触发。 2. 定义触发器的名称:为触发器选择一个有意义的名称,便于后续的使用和维护。

在MySQL中使用触发器实现数据自动更新

在MySQL中使用触发器实现数据自动更新 数据库是现代计算机领域中非常重要的一部分,用于存储和管理大量结构化数据。在数据库中,数据的一致性和完整性是至关重要的,因此实现数据自动更新成为了一个常见的需求。而MySQL作为最流行的开源关系型数据库管理系统,提供了丰富的功能来满足这一需求,其中包括触发器(Trigger)的使用。 触发器是MySQL中的一种特殊对象,它可以在指定的数据库事件发生时自动执行一组SQL语句。这些事件可以是INSERT、UPDATE或DELETE等操作。通过使用触发器,我们可以在数据库中定义一些业务逻辑,以实现数据的自动更新。 一、触发器的语法和基本用法 在MySQL中,创建触发器需要使用CREATE TRIGGER语句。触发器的基本语法如下: CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW trigger_action 其中,trigger_name是触发器的名称,trigger_time指定了触发器何时执行,trigger_event指定了触发器对应的事件,table_name是触发器所绑定的表名,FOR EACH ROW表示触发器会基于每一行数据进行执行,trigger_action指定了触发器的具体操作。 下面是一个简单的例子来说明触发器的基本用法。假设我们有一个订单表(orders),包含了订单编号(order_id)和订单状态(status)两个字段。我们希望在订单状态更新时,自动记录下状态变更的时间。 首先,我们需要创建一个触发器来实现这个功能:

mysql的触发器语法

mysql的触发器语法 MySQL中的触发器(Trigger)是一种特殊类型的存储过程,它在指定事件(如INSERT、UPDATE或DELETE)发生时自动执行。以下是MySQL触发器的基本语法: ```sql CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW BEGIN -- 触发器执行的SQL语句 END; ``` `trigger_name`:触发器的名称。 `trigger_time`:触发时间,指定触发器是在"BEFORE"还是"AFTER"指定的事件发生时执行。 `trigger_event`:触发的事件,指定触发器是在"INSERT"、"UPDATE"还是"DELETE"事件发生时执行。 `table_name`:触发器所关联的表名。 `BEGIN ... END`:触发器要执行的SQL语句块。

示例:创建一个在INSERT事件后执行的触发器,当在"employees"表中插入一条新记录后,将自动给该记录的"salary"列加薪10%。 ```sql CREATE TRIGGER after_insert_trigger AFTER INSERT ON employees FOR EACH ROW BEGIN UPDATE employees SET salary = salary WHERE id = ; END; ``` 请注意,触发器的具体语法和功能可能会根据MySQL的版本和配置有所不同。在使用触发器之前,请确保您已经仔细阅读了MySQL的官方文档,并根据您的数据库环境进行了适当的调整。

sql server 触发器 的写法

sql server 触发器的写法 SQL Server触发器是一种特殊类型的存储过程,其可以在指定的 表上定义并绑定到表的INSERT、UPDATE或DELETE语句操作上。当这 些操作被执行时,触发器将会自动触发,并按照事先定义的逻辑执行 相应的操作。触发器可以用于实现数据完整性约束、数据审计、数据 同步等应用场景。 下面,我将介绍SQL Server触发器的写法,包括触发器的创建、 绑定和编写触发逻辑等。 1.创建触发器 在SQL Server中,可以使用CREATE TRIGGER语句来创建触发器。触发器的创建包括触发器的名称、关联的表以及触发事件(INSERT、UPDATE或DELETE)。创建触发器的语法如下: CREATE TRIGGER trigger_name ON table_name [AFTER/INSTEAD OF] {INSERT, UPDATE, DELETE}

AS BEGIN --触发器的逻辑代码 END 其中,trigger_name是触发器的名称,table_name是触发器所关 联的表名,[AFTER/INSTEAD OF] {INSERT, UPDATE, DELETE}指定触发 器关联的触发事件类型。触发器的逻辑代码则位于BEGIN和END之间。 2.触发器的绑定 创建触发器后,需要将其绑定到相应的表上。可以使用ALTER TABLE语句来绑定触发器。绑定触发器的语法如下: ALTER TABLE table_name {ADD/DROP} TRIGGER trigger_name 其中,table_name是要绑定触发器的表名,{ADD/DROP} TRIGGER 指定要添加或删除的触发器。 3.编写触发器逻辑

mysql update触发器条件语句

mysql update触发器条件语句 MySQL是一种常用的关系型数据库管理系统,它支持触发器(trigger)功能,可以在数据库中的表上定义触发器,当满足某些条件时,触发器会自动执行相应的操作。在使用MySQL的update 触发器时,可以通过条件语句来指定触发器执行的条件。下面列举了10个不同的MySQL update触发器条件语句的例子。 1. 在更新操作时,限制某个字段的值必须大于10: ```sql CREATE TRIGGER trigger_name BEFORE UPDATE ON table_name FOR EACH ROW BEGIN IF NEW.field_name <= 10 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'field_name must be greater than 10'; END IF; END; ``` 2. 在更新操作时,限制某个字段的值必须在一个指定的范围内: ```sql CREATE TRIGGER trigger_name

BEFORE UPDATE ON table_name FOR EACH ROW BEGIN IF NEW.field_name < 0 OR NEW.field_name > 100 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'field_name must be between 0 and 100'; END IF; END; ``` 3. 在更新操作时,限制某个字段的值必须是一个指定的枚举值: ```sql CREATE TRIGGER trigger_name BEFORE UPDATE ON table_name FOR EACH ROW BEGIN IF NEW.field_name NOT IN ('value1', 'value2', 'value3') THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'field_name must be one of value1, value2, or value3'; END IF;

创建触发器sql语句简单例子

创建触发器sql语句简单例子 触发器是一种数据库对象,它可以在发生特定事件时自动执行指定的SQL语句或指定程序。触发器是一种被动的数据库对象,当数据表中的数据进行增、删、改操作时,触发器可以用来保持数据完整性、数据一致性和数据安全性。在本文中,我们将学习如何创建触发器SQL语句,为您提供一些简单的例 子和相关的参考内容。 创建触发器SQL语句中包含了触发器的名称、所触发的事件、执行的SQL语句、以及触发之前或之后执行。下面是一个创 建触发器SQL的简单格式: CREATE TRIGGER trigger_name [AFTER | BEFORE] event_name ON table_name [FOR EACH ROW] EXECUTE PROCEDURE function_name; 其中,trigger_name 是所创建的触发器的名称,event_name 是 事件的类型,例如 INSERT、UPDATE、DELETE, table_name 是对应的数据表的名称,它将触发触发器,而 FOR EACH ROW标识该触发器将对数据表的每一行执行,EXECUTE PROCEDURE function_name 是触发器执行的具体 操作。 触发器可以进行多个操作,例如:插入、更新和删除数据。下面是一些简单的例子,演示了如何创建用于在执行基本操作时

触发触发器的语句。 1. 创建一个触发器,用于在每次插入数据时向另一个表中插入相同的数据。 CREATE TRIGGER new_user_trigger AFTER INSERT ON users FOR EACH ROW EXECUTE PROCEDURE insert_new_user(); 这个触发器会在每次向 users 表中插入新行时,自动调用名为insert_new_user() 的函数。 2. 创建一个触发器,用于更新数据时,若有相同数据,则删除旧的数据。 CREATE TRIGGER update_user_trigger BEFORE UPDATE ON users FOR EACH ROW EXECUTE PROCEDURE update_user(); 这个触发器是在更新users表中的数据之前检查是否有重复数据,如果有,则先删除旧的数据,再插入新的数据。 3. 创建一个触发器,用于在删除数据前,先将删除的数据插入另外一个table表中。

sqlserver触发器中获取触发触发器的这条sql语句

sqlserver触发器中获取触发触发器的这条sql语句 在SQL Server 中,你可以在触发器中使用CONTEXT_INFO()函数来获取触发触发器的SQL 语句。CONTEXT_INFO()函数返回一个varbinary类型的值,该值包含了触发器执行的上下文信息。 以下是一个示例,演示如何在触发器中使用CONTEXT_INFO()函数来获取触发触发器的SQL 语句: sql CREATE TRIGGER MyTrigger ON MyTable AFTER INSERT, UPDATE, DELETE AS BEGIN DECLARE@sql NVARCHAR(MAX); SET@sql = CAST(CONTEXT_INFO() AS NVARCHAR(MAX)); PRINT @sql; -- 打印触发器执行的 SQL 语句 END; 在上述示例中,MyTrigger是触发器的名称,MyTable是触发器所在的表。AFTER INSERT, UPDATE, DELETE表示触发器在插入、更新或删除操作之后执行。 在触发器的主体部分,我们使用SET语句将CONTEXT_INFO()函数的返回值转换 为NVARCHAR(MAX)类型的变量@sql。然后,我们使用PRINT语句打印该变量的值,即触发器执行的SQL 语句。 请注意,CONTEXT_INFO()函数返回的上下文信息中包含了触发器执行的完整SQL 语句。因此,如果你的触发器执行了多个SQL 语句,它们都会包含在返回的上下文信息中。如果你只想获取特定的SQL 语句,你可能需要对返回的上下文信息进行进一步处理或解析。

sql触发器语句的使用流程

SQL触发器语句的使用流程 1. 触发器简介 触发器是SQL中一种特殊的过程,它会在SQL语句执行之前或之后自动被触 发执行。通过触发器,我们可以在数据库中插入、更新或删除记录时执行一系列的操作。本文将介绍SQL触发器语句的使用流程。 2. 创建触发器 在SQL中,创建触发器需要使用CREATE TRIGGER语句。下面是创建触发器的 语法: CREATE TRIGGER trigger_name AFTER/BEFORE INSERT/UPDATE/DELETE ON table_name FOR EACH ROW BEGIN -- 触发器的操作语句 END; •trigger_name为触发器的名称,可以根据具体需求自行命名。 •AFTER/BEFORE指定触发器是在SQL语句执行之前还是之后触发执行。 •INSERT/UPDATE/DELETE指定触发器是在插入、更新或删除记录时触发执行。 •table_name为触发器所属的表名。 •FOR EACH ROW表示触发器是逐行触发执行的。 3. 触发器的操作语句 在触发器的BEGIN和END之间可以编写一系列的操作语句。这些操作语句可以 是SQL语句、条件语句、循环语句等。 下面是一个示例,创建一个触发器在插入记录时更新另一个表中的记录: CREATE TRIGGER update_another_table AFTER INSERT ON table1 FOR EACH ROW BEGIN UPDATE table2 SET column1 =NEW.column1 WHERE id=NEW.id; END; 在上述示例中,每当向table1表中插入一条记录时,触发器就会自动执行。 执行的操作是将插入的记录中的column1的值更新到table2表中对应记录的column1字段。

数据库trigger语句

数据库trigger语句 数据库触发器(Trigger)是一种在数据库中自动执行的存储过程,它在数据库表的特定事件(如插入、更新或删除数据)发生时被触发。触发器可以用于实现一些复杂的业务逻辑和数据完整性约束,提高数据库的可靠性和安全性。下面列举了十个常用的数据库触发器语句,以及它们的应用场景和注意事项。 1. 插入触发器 当向某个表中插入新的数据时,可以通过插入触发器对数据进行自动处理。例如,当插入用户表中的数据时,可以使用插入触发器自动为新用户生成一个唯一的用户ID,并设置默认的用户权限。 ```sql CREATE TRIGGER insert_trigger AFTER INSERT ON users FOR EACH ROW BEGIN SET https://www.wendangku.net/doc/2619378572.html,er_id = UUID(); SET NEW.permission = 'default'; END; ``` 2. 更新触发器

当某个表中的数据发生更新时,可以通过更新触发器对数据进行自动处理。例如,当更新订单表中的数据时,可以使用更新触发器自动计算订单的总金额,并更新相应的统计信息。 ```sql CREATE TRIGGER update_trigger AFTER UPDATE ON orders FOR EACH ROW BEGIN UPDATE statistics SET total_amount = total_amount - OLD.amount + NEW.amount; END; ``` 3. 删除触发器 当从某个表中删除数据时,可以通过删除触发器对数据进行自动处理。例如,当删除商品表中的数据时,可以使用删除触发器自动将该商品从购物车中移除。 ```sql CREATE TRIGGER delete_trigger AFTER DELETE ON products FOR EACH ROW

相关文档