`
北极的。鱼
  • 浏览: 160811 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转】数据库trigger

 
阅读更多

转自:http://www.cnblogs.com/hoojo/archive/2011/07/20/2111316.html

 

触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。

Ø 什么是触发器

    触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。触发器一般用在check约束更加复杂的约束上面。触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作。诸如:update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。

 

    DML触发器分为:

    1、 after触发器(之后触发)

        a、 insert触发器

        b、 update触发器

        c、 delete触发器

 

    2、 instead of 触发器 (之前触发)

 

    其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。

 

    触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。这两张是逻辑表也是虚表。有系统在内存中创建者两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。

 

 

对表的操作

Inserted逻辑表

Deleted逻辑表

增加记录(insert)

存放增加的记录

删除记录(delete)

存放被删除的记录

修改记录(update)

存放更新后的记录

存放更新前的记录

 

    Update数据的时候就是先删除表记录,然后增加一条记录。这样在inserted和deleted表就都有update后的数据记录了。注意的是:触发器本身就是一个事务,所以在触发器里面可以对修改数据进行一些特殊的检查。如果不满足可以利用事务回滚,撤销操作。

 

Ø 创建触发器

    语法

create trigger tgr_name
on table_name
with encrypion –加密触发器
for update...
as
    Transact-SQL

 # 创建insert类型触发器

--创建insert插入类型触发器
if (object_id('tgr_classes_insert', 'tr') is not null)
    drop trigger tgr_classes_insert
go
create trigger tgr_classes_insert
on classes
for insert --插入触发
as
    --定义变量
    declare @id int, @name varchar(20), @temp int;
    --在inserted表中查询已经插入记录信息
    select @id = id, @name = name from inserted;
    set @name = @name + convert(varchar, @id);
    set @temp = @id / 2;    
    insert into student values(@name, 18 + @id, @temp, @id);
    print '添加学生成功!';
go
--插入数据
insert into classes values('5班', getDate());
--查询数据
select * from classes;
select * from student order by id;

 insert触发器,会在inserted表中添加一条刚插入的记录。

 

# 创建delete类型触发器

--delete删除类型触发器
if (object_id('tgr_classes_delete', 'TR') is not null)
    drop trigger tgr_classes_delete
go
create trigger tgr_classes_delete
on classes
    for delete --删除触发
as
    print '备份数据中……';    
    if (object_id('classesBackup', 'U') is not null)
        --存在classesBackup,直接插入数据
        insert into classesBackup select name, createDate from deleted;
    else
        --不存在classesBackup创建再插入
        select * into classesBackup from deleted;
    print '备份数据成功!';
go
--
--不显示影响行数
--set nocount on;
delete classes where name = '5班';
--查询数据
select * from classes;
select * from classesBackup;

 delete触发器会在删除数据的时候,将刚才删除的数据保存在deleted表中。

 

    # 创建update类型触发器

--update更新类型触发器
if (object_id('tgr_classes_update', 'TR') is not null)
    drop trigger tgr_classes_update
go
create trigger tgr_classes_update
on classes
    for update
as
    declare @oldName varchar(20), @newName varchar(20);
    --更新前的数据
    select @oldName = name from deleted;
    if (exists (select * from student where name like '%'+ @oldName + '%'))
        begin
            --更新后的数据
            select @newName = name from inserted;
            update student set name = replace(name, @oldName, @newName) where name like '%'+ @oldName + '%';
            print '级联修改数据成功!';
        end
    else
        print '无需修改student表!';
go
--查询数据
select * from student order by id;
select * from classes;
update classes set name = '五班' where name = '5班';

 update触发器会在更新数据后,将更新前的数据保存在deleted表中,更新后的数据保存在inserted表中。

 

    # update更新列级触发器

if (object_id('tgr_classes_update_column', 'TR') is not null)
    drop trigger tgr_classes_update_column
go
create trigger tgr_classes_update_column
on classes
    for update
as
    --列级触发器:是否更新了班级创建时间
    if (update(createDate))
    begin
        raisError('系统提示:班级创建时间不能修改!', 16, 11);
        rollback tran;
    end
go
--测试
select * from student order by id;
select * from classes;
update classes set createDate = getDate() where id = 3;
update classes set name = '四班' where id = 7;

 更新列级触发器可以用update是否判断更新列记录;

 

    # instead of类型触发器

       instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身的内容。

       创建语法

create trigger tgr_name
on table_name
with encryption
    instead of update...
as
    T-SQL

 # 创建instead of触发器

if (object_id('tgr_classes_inteadOf', 'TR') is not null)
    drop trigger tgr_classes_inteadOf
go
create trigger tgr_classes_inteadOf
on classes
    instead of delete/*, update, insert*/
as
    declare @id int, @name varchar(20);
    --查询被删除的信息,病赋值
    select @id = id, @name = name from deleted;
    print 'id: ' + convert(varchar, @id) + ', name: ' + @name;
    --先删除student的信息
    delete student where cid = @id;
    --再删除classes的信息
    delete classes where id = @id;
    print '删除[ id: ' + convert(varchar, @id) + ', name: ' + @name + ' ] 的信息成功!';
go
--test
select * from student order by id;
select * from classes;
delete classes where id = 7;

 # 显示自定义消息raiserror

if (object_id('tgr_message', 'TR') is not null)
    drop trigger tgr_message
go
create trigger tgr_message
on student
    after insert, update
as raisError('tgr_message触发器被触发', 16, 10);
go
--test
insert into student values('lily', 22, 1, 7);
update student set sex = 0 where name = 'lucy';
select * from student order by id;

 # 修改触发器

alter trigger tgr_message
on student
after delete
as raisError('tgr_message触发器被触发', 16, 10);
go
--test
delete from student where name = 'lucy';

  # 启用、禁用触发器

--禁用触发器
disable trigger tgr_message on student;
--启用触发器
enable trigger tgr_message on student;

 # 查询创建的触发器信息

--查询已存在的触发器
select * from sys.triggers;
select * from sys.objects where type = 'TR';

--查看触发器触发事件
select te.* from sys.trigger_events te join sys.triggers t
on t.object_id = te.object_id
where t.parent_class = 0 and t.name = 'tgr_valid_data';

--查看创建触发器语句
exec sp_helptext 'tgr_message';

 # 示例,验证插入数据

if ((object_id('tgr_valid_data', 'TR') is not null))
    drop trigger tgr_valid_data
go
create trigger tgr_valid_data
on student
after insert
as
    declare @age int,
            @name varchar(20);
    select @name = s.name, @age = s.age from inserted s;
    if (@age < 18)
    begin
        raisError('插入新数据的age有问题', 16, 1);
        rollback tran;
    end
go
--test
insert into student values('forest', 2, 0, 7);
insert into student values('forest', 22, 0, 7);
select * from student order by id;

  # 示例,操作日志

if (object_id('log', 'U') is not null)
    drop table log
go
create table log(
    id int identity(1, 1) primary key,
    action varchar(20),
    createDate datetime default getDate()
)
go
if (exists (select * from sys.objects where name = 'tgr_student_log'))
    drop trigger tgr_student_log
go
create trigger tgr_student_log
on student
after insert, update, delete
as
    if ((exists (select 1 from inserted)) and (exists (select 1 from deleted)))
    begin
        insert into log(action) values('updated');
    end
    else if (exists (select 1 from inserted) and not exists (select 1 from deleted))
    begin
        insert into log(action) values('inserted');
    end
    else if (not exists (select 1 from inserted) and exists (select 1 from deleted))
    begin
        insert into log(action) values('deleted');
    end
go
--test
insert into student values('king', 22, 1, 7);
update student set sex = 0 where name = 'king';
delete student where name = 'king';
select * from log;
select * from student order by id;

 

分享到:
评论

相关推荐

    分布式云数据库复合Trigger新机制.pdf

    分布式云数据库复合Trigger新机制是针对现代大数据环境下,如何高效地管理和同步分布式系统中的数据而提出的一种创新方法。传统的数据管理主要集中在应用程序内部的缓存更新,但随着大数据的广泛应用,这种局限性变...

    神通数据库-数据库快速入门.pdf

    触发器由 CREATE TRIGGER 语句定义,FOR EACH 子句定义了触发动作的间隔尺寸,它既 可以是 FOR EACH STATEMENT(语句级触发器),也可以是 FOR EACH ROW(行级触发器)。 • 支持事务处理 神通数据库提供了高效的...

    数据库触发器(Trigger)的一点使用心得

    数据库触发器(Trigger)是数据库管理系统提供的一种机制,允许在特定的数据操作(如INSERT、UPDATE、DELETE)之前或之后执行自定义的逻辑。触发器在数据库层面上实现了业务规则和数据完整性,使得开发者可以在数据库...

    数据库管理系统 1.数据库(DB),数据库系统(DBS)和数据库管理系统(DBMS)之间的关系是( )。

    在关系数据库管理系统中,TRIGGER 语句是用于创建触发器的。 在关系数据库管理系统中,STORED PROCEDURE 语句是用于创建存储过程的。 在关系数据库管理系统中,FUNCTION 语句是用于创建函数的。

    Oracle Table Form Trigger

    Oracle Table Form Trigger是Oracle数据库应用开发中的重要概念,主要涉及三方面:Oracle表格(Table)、表单(Form)以及触发器(Trigger)。本篇将详细阐述这三个关键元素及其相互关系。 1. Oracle表格(Table)...

    SQL Server数据库技术期末大作业 代码与数据库

    【SQL Server数据库技术期末大作业 代码与数据库】 在SQL Server数据库技术的学习中,期末大作业通常会涵盖多个核心概念,以检验学生对数据库管理、查询优化和事务处理的理解。根据提供的文件名,我们可以推断出这...

    quartz动态从数据库获取时间定时

    4. **监听数据库变化**:设置数据库监听器,当数据库中的任务信息发生变化时,更新对应的Trigger或重新创建。 5. **调度Job**:将JobDetail和Trigger关联,并添加到Scheduler中。当Trigger的触发条件满足时,...

    数据库上机实验(含学生数据库,职工数据库,sailboats数据库sql可导入文件)

    此外,你还将学习触发器(TRIGGER)和存储过程(STORED PROCEDURE)的使用,这些是数据库编程的重要组成部分。 实验指导书将提供详细的步骤和解释,帮助你逐步完成每个任务。报告中的题目答案和运行结果截图可以...

    Quartz定时任务常用的11张数据库脚本表结构

    在Quartz中,任务和触发器的配置信息是通过数据库存储的,这使得任务调度具有高可用性和可扩展性。这里我们将详细探讨Quartz定时任务在数据库中的11张核心表结构。 1. **QRTZ_JOB_DETAILS**:此表存储所有Job的详细...

    利用数据库的修改数据库

    创建和修改这些对象通常涉及CREATE TRIGGER和CREATE PROCEDURE语句。 六、视图的创建与修改 视图是虚拟表,基于一个或多个表的SELECT查询结果。视图可以简化数据访问,隐藏复杂查询,甚至提供安全性。ALTER VIEW...

    一个完整的ORACLE的触发器代码

    在Oracle数据库中,触发器是一种存储过程,它被设计为当特定事件(如数据插入、更新或删除)发生时自动执行。触发器可以用于执行复杂的业务逻辑或者数据完整性检查等操作。 #### 二、触发器类型与语法结构 根据...

    sql server 2000中的用户数据库----pubs数据库

    - **触发器**:定义触发器(CREATE TRIGGER)以在特定的数据库操作(如INSERT、UPDATE、DELETE)发生时执行额外的逻辑。 3. **在SQL Server 2005中的变化**: SQL Server 2005之后的版本中,不再包含pubs数据库...

    quartz 持久化数据库表结构sql

    Quartz的持久化机制依赖于一组特定的数据库表,这些表存储了Job(任务)和Trigger(触发器)的信息。以下是Quartz默认使用的数据库表: 1. QRTZ_JOB_DETAILS:存储Job的详细信息,如Job类名、是否持久化、组名等。 ...

    用友-数据库维护常识

    数据库的元素包括数据库表(TABLE)、存储过程(STORED PROCEDURE)、视图(VIEW)、触发器(TRIGGER)等。用友软件中使用的是微软的ACCESS和SQL Server关系数据库。数据库的数据结构形式可以分为三个模型:层次型...

    数据库基础教程[顾韵华][课后习题解答]

    3. 触发器(Trigger):在特定数据库事件(如插入、删除或更新)发生时自动执行的程序。 五、数据库安全与完整性 1. 权限与角色(Privileges and Roles):控制用户对数据库的访问权限,确保数据安全。 2. 完整性...

    查看登录oracle数据库用户记录.docx

    CREATE OR REPLACE TRIGGER LOG_LOGON AFTER LOGON ON DATABASE BEGIN INSERT INTO EVENT_LOG (login_time, username) VALUES (SYSTIMESTAMP, USER); COMMIT; END; ``` 查看登录 Oracle 数据库用户记录 最后,...

    如何查看数据库变更记录

    在IT领域,数据库管理是至关重要的任务之一,而监控数据库变更记录则是确保数据安全和追踪错误的重要手段。本文将详细讲解如何通过代码实现查看数据库变更记录,主要针对高级DBA(数据库管理员)。 首先,我们需要...

    PDMReader,数据库字典生成软件

    - 触发器(Trigger):与表操作相关的SQL触发器定义。 - 存储过程(Procedure)和函数(Function):数据库中的存储代码及其参数和返回值。 **4. 提高效率与一致性** 通过自动化生成数据字典,PDMReader避免了手动...

    数据库设计理论 数据库性能优化

    数据库设计理论 实体-关系建模技术 数据库的创建 数据一致性 数据库性能优化 Planning and Creating Index 数据查询 数据库设计的高级技术(View, SP, Trigger)

Global site tag (gtag.js) - Google Analytics