精华内容
下载资源
问答
  • 问题描述:在一个表中插入一条数据时,同时想更新这条数据 错误写法: create table t1 ( a int(11), b int(11) ) CREATE TRIGGER trigger BEFORE INSERT ON t1 FOR EACH ROW BEGIN update t1 set new.a=1; ...

    问题描述:在一个表中插入一条数据时,同时想更新这条数据

    错误写法:

    create table t1
    (
    	a int(11),
    	b int(11)
    )
    
    CREATE TRIGGER trigger
    BEFORE
    INSERT ON t1
    FOR EACH ROW
    BEGIN
    	update t1 set new.a=1;
    END

    这样会报这个错误:Can't update table 't1' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

    原因是触发器里不能对刚插入的数据update,网上有的人解释是会造成触发器循环调用,但触发器明明是insert类型,而update语句只能激活update类型的触发器?这个疑问先记下。。。

    几种触发器类型和激活语句如下

    上面触发器正确的写法应该把update t1去掉就可以了

    CREATE TRIGGER trigger
    BEFORE
    INSERT ON t1
    FOR EACH ROW
    BEGIN
    	set new.a=1;
    END

     

    展开全文
  • 触发器

    2018-11-13 18:44:35
    一、触发器的主要优点 二、触发器支持的功能 三、触发器的类别 四、SQL Server中触发器的创建、删除和修改  4.1创建触发器的语句 4.2删除和修改触发器 4.3触发器中可使用的特殊表(inserted表和deleted表) ...

    目录

    一、触发器的主要优点

    二、触发器支持的功能

    三、触发器的类别

    四、SQL Server中触发器的创建、删除和修改 

    4.1创建触发器的语句

    4.2删除和修改触发器

    4.3触发器中可使用的特殊表(inserted表和deleted表)

     五、 触发器应用举例

    5.1INSERT 触发器

    5.2 DELETE触发器

    5.3 UPDATE触发器 

    六、使用触发器的考虑


     

      触发器(Trigger)不仅能实现完整性规则,而且能保证一些较复杂业务规则的实施。  

            所谓触发器就是一类由事件驱动的特殊过程(特殊类型的存储过程),当一个触发器建立后,它作为一个数据库对象被存储。当某个触发事件发生时,触发器被触发,执行一系列操作。  

            触发器一旦由某个用户建立,任何用户对该触发器指定的数据进行增、删或改操作时,DBMS系统将自动激活相应的触发器,定义在触发器中的功能将被DBMS执行,在核心层进行集中的完整性控制。

            触发器使用户定义在关系表上的一类由事件驱动的特殊过程。一旦定义就被保存在数据库服务器中。触发器类似于约束,单是比约束更加灵活,可以实施更为复杂的检查和操作,具有更精细和更强大的数据控制能力。

     

    一、触发器的主要优点

    触发器的主要优点 
     ⑴ 触发器能够实施比外键约束,检查约束和规则对象 
        等更为复杂的数据完整性检查。
     ⑵ 和约束相比,触发器提供了更多的灵活性。约束将
        系统错误信息返回给用户,而触发器可以打印错误   
        信息,调用其他存储过程,或根据需要纠正错误。
     ⑶ 无论对表中的数据进行何种更新(增删改操作),
        相应的触发器都能被激活,对数据实施完整性检查
        和处理。
     ⑷ 触发器能够级联更新数据库中的表内容

     

    二、触发器支持的功能

    ⑴ 触发器可以在事件之前、之后执行,还可以替代触 
        发语句的操作。例如可以定义触发器在对某关系执
        行INSERT、 UPDATE和DELETE操作之前后触发。
    ⑵ 触发器有语句级触发器和行级触发器之分。对被事 
        件影响修改的每一行(FOR EACH ROW)即每一元组
        执行一次触发过程,称为行级触发器。对整个事件     
        只执行一次触发过程(FOR EACH STATEMENT),称
        为语句级触发器,该方式是触发器的默认方式。
    ⑶ 对于UPDATE事件可以定义对哪个关系、或关系
        中的哪一列修改时,触发器触发。
    ⑷ 可以指定执行条件,当触发器被触发后,触发器
        功能代码只有在条件成立时才执行。
    ⑸ 触发器代码可以引用事件中对于元组修改前后的值(OLD值和NEW值)。
    ⑹ 触发器可以完成一些复杂的数据检查,可以实现某些操作的前后处理等。
    ⑺ 触发器定义的约束可以在任何颗粒级别上实现、表示动态的或静态的约
        束、延迟或不延迟进行触发检查、可以用SQL语句定义约束触发器的功能。

     

    三、触发器的类别

    ⑴ 按触发事件分:有INSERT触发器、 UPDATE触发器和DELETE触发器之分。
    ⑵ 按触发时间分:有BEFORE触发器和AFTER触发器之分。
                                  BEFORE触发器是在事件发生之前触发,AFTER触发器是在事件发生之后触发。
    ⑶ 按触发方式分:有语句级触发器和行级触发器之分。
       注:SQL Server 对上述部分功能可实现,但在语法描述上有区别。

    四、SQL Server中触发器的创建、删除和修改 

    触发器的定义包括两个方面:指明触发器的触发事件指明触发器执行的动作

    4.1创建触发器的语句

    创建触发器的语句一般格式为:

    CREATE TRIGGER <触发器名> ON {<表名>|<视图名>} 
      [WITH ENCRYPTION] 
      FOR {[INSERT][,][UPDATA][,][DELETE]}
    AS 
    T-SQL语句序列 
    

    说明:
    ① 表名,视图名:为触发该触发器的表名或视图名。  
       SQL Server中,只有表的所有者才有权建立触发器。
    ② INSERT,UPDATA,DELETE :说明触发触发器的事件。
                                                        一个定义语句允许定义多个触发事件,用逗号分开。
    ③ WITH ENCRYPTION:该选项对触发器定义文本加密。
    ④ T-SQL操作语句序列:指定触发器动作。该语句中可以指定多个触发器操作,
                                            这时要用BEGIN…END将它们组成语句块。

     

    4.2删除和修改触发器

    (1)删除触发表时,触发器被随之删除。
    (2)可以用DROP语句删除已定义的触发器。
        也可以使用ALTER TRIGGER语句修改触发器定义。
    例如,删除已定义触发器的语句格式:
     DROP TRIGGER <触发器名> [,<触发器名>…]

     

    4.3触发器中可使用的特殊表(inserted表和deleted表)

    使用触发器时,SQL Server提供了两张特殊的临时表:
        inserted表和deleted表
        这两张表存在于高速缓存中,它们与创建触发器的表有相同的结构。
        用户可以使用该表检查某些修改操作的效果。
        但用户不能直接修改该表中的数据。
        用户可以使用该表的内容作为查询操作的判断条件,但要在FROM中写出使用的表名(inserted或deleted)。 
     

    ① inserted表:
        存放被INSERTE插入和UPDATE更新的新数据。当向表中插入数据时,INSERT触发器被触发。新的记录增加到触发器表中和inserted表中。  
        inserted表是一个逻辑表,保存了所插入记录的拷贝,触发器可以检查inserted表,来确定该触发器的操作是否应该执行和如何执行。

    ② deleted表:
        存放被DELETE删除和UPDATE更新的旧数据。
        当触发一个DELETE触发器时,被删除的记录放在一个特殊的deleted表中。
        deleted表是一个逻辑表,用来保存已经从表中删除的记录。DELETE触发器可以参考deleted表中的数据。

    注:
       UPDATE触发器可使用deleted表和inserted表修改一条记录等于删除一条旧记录和插入一条新记录。
       UPDATE可以看成是由DELETE语句和 INSERT 语句组成。当在一个有UPDATE触发器的表上修改一条记
       录时,表中原来的记录移动到deleted表中,修改过的记录插入到inserted表中。UPDATE触发器可以
       参考deleted表和inserted表,以便确定如何执行触发器的操作。

     

     五、 触发器应用举例

    创建触发器的语句一般格式为:

    CREATE TRIGGER <触发器名> ON {<表名>|<视图名>} 
      [WITH ENCRYPTION] 
      FOR {[INSERT][,][UPDATA][,][DELETE]}
    AS 
    T-SQL语句序列 
    

     

    假设学生表S新增一属性Cnum(类型为INT,初值均为0), 记录该学生的选课数,分别创建如下触发器:

    5.1INSERT 触发器

    例1.创建INSERT 触发器Tri1,其功能是:在学习表SC插入一条记录后,立即更新学生表S的Cnum属性,即将原值加一

     CREATE TRIGGER Tri1 ON SC FOR INSERT
         AS
         UPDATE Student SET Cnum=Cnum+1
         WHERE Student.Sno=(SELECT Sno FROM inserted WHERE Student.Sno=inserted.Sno)

    执行:

    go
    create trigger tri1 on Cj for insert
    	as
    	update Student set Cnum=Cnum+1
    	where Student.sno=(select Sno from inserted where Student.Sno=inserted.Sno)
    go
    
    insert into Cj values(2000101,1,92);
    -- 运行结果:
    (1 行受影响)
    
    (1 行受影响) -- 也影响了student表的一行
    
    
    go -- 存储过程
    create procedure fs
    as select * from Student;
    
    exec fs;
    运行结果:
    2000101	李勇      	男	20	00311	1  --果然Cnum也加1了
    2000102	刘诗晨    	女	19	00311	0
    

     

     

    5.2 DELETE触发器

    例9.创建DELETE触发器Tri2,其功能是:在删除学习表SC一条记录后,立即更新学生表S的Cnum属性,即将原值减一.

    CREATE TRIGGER Tri2 ON SC FOR DELETE
         AS
           UPDATE Student SET Cnum=Cnum-1
           WHERE Student.Sno=(SELECT Sno FROM deleted WHERE Student.Sno=deleted.Sno) 

    执行过程:

    go
    create trigger tri2 on Cj for delete
    	as
    	update Student set Cnum=Cnum-1
    	where Student.Sno=(Select Sno from deleted where Student.Sno=deleted.Sno);
    -- 命令已成功完成。
    
    delete Cj where Sno='2000101' and Cno='1';
    -- 运行结果
    (1 行受影响)
    (1 行受影响) -- 说明影响2行
    
    exec fc;
    exec fs;
    -- 运行结果: 
    2000101	李勇      	男	20	00311	0 -- Cnum果然减1了
    2000102	刘诗晨    	女	19	00311	0

     

     

    5.3 UPDATE触发器 

    例10 创建UPDATE 触发器Tri3,功能是:在SC表更新一条记录的学号后,立即更新学
         生表S的Cnum属性,改前学号学生的Cnum值减1,改后学号学生的Cnum值加1。

    go
    create trigger tri3 on Cj for update
    	as
    	    if update(Sno)
    		begin
    			update Student set Cnum=Cnum-1
    				where Sno=(select Sno from deleted where deleted.Sno=Student.Sno);
    			update Student set Cnum=Cnum+1
    				where Sno=(select Sno from inserted where inserted.Sno=Student.Sno);
    		end

    执行过程:

    go
    create trigger tri3 on Cj for update
    	as
    	    if update(Sno) -- 不可少 不然修改一下grade的值Sno并未删除 也会执行下面明显不合理
    		begin
    			update Student set Cnum=Cnum-1
    				where Sno=(select Sno from deleted where deleted.Sno=Student.Sno);
    			update Student set Cnum=Cnum+1
    				where Sno=(select Sno from inserted where inserted.Sno=Student.Sno);
    		end
    
    insert into Cj values(2000101,1,92);
    exec fs;
    exec fc;
    
    update Cj set Sno=2000103 where Sno=2000101;
    运行结果:
    (1 行受影响)
    
    (0 行受影响)
    
    (1 行受影响)
    --说明确实进行了3次操作
    
    
    注:if update(Sno)有了此句:
         只有改Sno的值才会触发触发器  改其他值不会(运行结果仅一行)

     

     

    六、使用触发器的考虑

    触发器最大的用途是维护数据完整性,而不是返回结果。

    只是在必要的时候使用触发器。如果使用约束、规则,
    默认就可以实现预定的数据完整性时,应优先考虑使用这3种措施

    使触发器的定义语句尽可能清晰简单。

    触发器一般定义在操作发生之后执行,约束在操作发生之前起作用。如果在触发器表上有约
    束,那么这些约束在触发器执行之前进行检查。如果操作与约束有冲突,那么触发器不执行。

    有的DBMS系统的触发器不能在临时表或视图上创建,但可以参照这些对象。

    触发器和激活它的语句作为单个事务处理,如果检查到严重错误,整个事务自动撤销。 
     

     

    附录:

    -- 触发器
    create database Trig;
    use Trig;
    
    create table Student(
    	Sno Char(7) primary key,--学号
    	Sname Char(10) not null,--学生姓名
    	Ssex Char(2) check(Ssex in('男','女')) default '男'not null,--性别
    	Sage Smallint check(Sage>14 and Sage<65),--年龄
    	Clno Char(5) not null,--学生所在班级号
    	Cnum int default 0 -- 选课数
    ); 
    
    create table Cj(
    	Sno Char(7),--学号
    	Cno Char(1),--课程号
    	Grade Decimal(4,1) check(Grade>0 and Grade<100),--成绩
    	primary key(Sno,Cno)
    );
    
    
    -- 预备语句
    insert into Student values(2000101,'李勇','男',20,'00311',0);--汉字字符型必须''
    insert into Student values(2000102,'刘诗晨','女','19','00311',0);--int型可以传递字符串(不打'')
    select * from Student;
    
    select * from Cj;
    insert into Cj values(2000101,1,92);
    
    
    -- 往Cj表新增一条记录  对Studnet表相应学号的学生Cnum+1(选课数+1)
    go
    create trigger tri1 on Cj for insert
    	as
    	update Student set Cnum=Cnum+1
    	where Student.sno=(select Sno from inserted where Student.Sno=inserted.Sno)
    
    
    go
    create procedure fs
    as select * from Student;
    --也ok
    go
    create procedure fc
    as select * from Cj;
    
    exec fs
    
    
    
    -- delete
    go
    create trigger tri2 on Cj for delete
    	as
    	update Student set Cnum=Cnum-1
    	where Student.Sno=(Select Sno from deleted where Student.Sno=deleted.Sno);
    -- 命令已成功完成。
    delete Cj where Sno='2000101' and Cno='1';
    -- 运行结果
    (1 行受影响)
    (1 行受影响)
    
    exec fc;
    exec fs;
    
    
    -- update
    go
    create trigger tri3 on Cj for update
    	as
    	    if update(Sno)
    		begin
    			update Student set Cnum=Cnum-1
    				where Sno=(select Sno from deleted where deleted.Sno=Student.Sno);
    			update Student set Cnum=Cnum+1
    				where Sno=(select Sno from inserted where inserted.Sno=Student.Sno);
    		end
    
    
    
    insert into Cj values(2000101,1,92);
    exec fs;
    exec fc;
    update Cj set Sno=2000103 where Sno=2000101;

     

     

    展开全文
  • 触发器是一种特殊的存储过程,能够完成主键和外键不... 可以设定错误返回信息,增加程序的可维护性。 触发器可以调用更多的存储过程。 主要优点: 触发器是自动执行的,一旦设立就存在一种触发机制,永远监控着数...

    触发器是一种特殊的存储过程,能够完成主键和外键不能保证的复杂的数据完整性和一致性。

    主要用途:

    1. 对数据库间的完整性做强制约束。
    2. 对数据库中的表进行级联操作,可以自动触发操作类型。
    3. 跟踪变化,对违法的操作进行回滚或撤销,保证数据库的安全。
    4. 可以设定错误返回信息,增加程序的可维护性。
    5. 触发器可以调用更多的存储过程。

    主要优点:

    • 触发器是自动执行的,一旦设立就存在一种触发机制,永远监控着数据库的事件状态。
    • 触发器可以对数据库中的表进行层叠更改。
    • 触发器可以设置比check更为复杂的约束限制。触发器还可以对不同表中的列进行引用。

    1,数据操作触发器(DML)

    ceate trigger triggername

    on table

    {after/before/instead of } {insert,update,delete}

    as

    begin

    //PL/SQl 过程块

    end

    after:用于指定触发器在SQL语句中指定数据操作完成后才能被触发有关级联操作和约束性检查成功后才能执行操作。after只能创建在表上,不能创建在触发器。使用after触发器首先会建立inserted,deleted,表然后执行SQL语句中的数据操作,最后才会执行触发器中的代码。

    instead of 是一种动作执行前的触发类型,用触发器代替触发语句进行操作。在表或视图中只能定义一个instead of 触发器,可以定义多个after触发器。使用instead of触发器则是在建立inserted,deleted表后直接对触发器进行执行。

    before:一种动作执行前的触发类型

    2:数据定义语言触发器(DDL)

    数据定义语言触发器主要是为了响应各种数据定义语言事件而响应,主要与create,,alter,drop开头的T-SQL语句相对应。

    例如拒绝用户对数据库中的表进行删除和更改操作。

    如果想让整个服务器都收到DDL触发器的约束,可以创建作用于服务器中的触发器

    触发器的常用应用

    1,创建登录触发器

    当用log_test登录时,登录失败。

    2,限制非工作时间操作数据

    创建触发器允许log_test只能在8:00-17:00登录

    重命名触发器

    exec sp_rename Oldname,Newname

    展开全文
  • 关于mysql触发器的介绍

    千次阅读 2017-04-27 15:39:34
    触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MYSQL自动调用。 触发器可以让你在执行INSERT,UPDATE或者DELETE...

    1. 触发器的介绍
    触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MYSQL自动调用。
    触发器可以让你在执行INSERT,UPDATE或者DELETE的时候,执行一些特定的操作,可以在MYSQL中指定实在SQL语句执行前触发还是执行后出发。比如说记录用户每次修改一次数据库的日志。就可以创建触发器在AFTER UPDATE后自动执行插入记录,所以触发器可以简化数据库操作,也可以用来维护数据库数据的一致性,对数据库的维护有着很重要的作用。
    2. MYSQL触发器的注意事项
    (1)对于每一个表的每一个事件的触发,最多只能定义一个触发器,比如说你不能定义两个AFTER INSERT的触发器,但是可以定义其他的触发点的触发器。
    (2)MYSQL只支持“基于行的触发”,也就是说触发器始终是针对一条记录的,如果变更的数据集非常大,效率会很低。
    (3)触发器并不一定能够保证更新的原子性。
    (i)在更新MYISAM的表时,如果遇到错误是不会回滚的。
    (ii)在更新INNODB的表时,由于触发器是在同一事务中完成,所以它们的执行操作是原子的(MYISAM与INNODB之间的区别可以看我的博客中博文有对此的具体介绍)
    3. 触发器的具体应用实例
    场景:假设系统中有两个表:

    班级表 class(班级号 classID, 班内学生数 stuCount)


    学生表 student(学号 stuID, 所属班级号 classID)


    要创建触发器来使班级表中的班内学生数随着学生的添加自动更新,代码如下:


    当我们插入一条学生ID为8,班级ID为2的纪录就可以看到对应班级表中编号为2的学生数增加了一位。



    展开全文
  • 钟控触发器

    千次阅读 2019-04-26 09:57:37
    其中电位式触发器结构最简单,前述的四种不同功能的触发器RS、D、JK、T,是按电位式触发器描述的。这里介绍其它结构形式的RS或D或JK或T触发器。1.电位式触发器的缺陷  电位式触发器在CP为高电平期间,能接收控制...
  • pl触发器

    2020-11-04 13:22:00
    触发器概述分类1.语句级触发器2.行级触发器3.instead of 触发器...引发数据库事件发生,(系统启动退出,产生异常,错误) 引发用户事件(登录退出数据库) 模板 create [or replace] trriger tri_name [before|afte
  • 1.问题描述: 在更新记录时,检测到特定的一个记录就将这个记录的某个属性设置为100。(更新本表) 2.问题背景: mysql Ver 14.14 Distrib 5.5.31 mysql> describe SC; +-------+----------+------+----...
  • 描述 2 E_WARNING 非致命的 run-time 错误。不暂停脚本执行。 8 E_NOTICE run-time 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。 256 E_USER_ERROR 致命的用户生成的错误。这...
  • 在创建触发器时,若出错,可以用RAISERROR方法来将错误消息返回至应用程序,使用try catch 来捕获。 CREATE TRIGGER trg ON tb  FOR UPDATE AS BEGIN   RAISERROR('错误!不允许删除',16,1)  ROLLBACK...
  • 现在公司有台机器,机器的状态有0,1,2,3,机器开启运行状态的时候是0,其他的 1、2和3对应的是其他状态,机器一开启就会自动有...请问我的table2触发器代码哪里出问题了,请大神帮我分析下,可以加我QQ详细描述:584958184
  • SQL SERVER数据库问题,错误描述:Subquery returned more than 1 value. This is illegal when the subquery follows =, !=, <, <= , >, >=, or when the subquery is used as an expression.子查询...
  • Oracle触发器

    2021-03-02 16:18:07
    触发器 触发器是当特定事件出现时自动执行的存储过程 特定事件可以是执行更新的DML语句和DDL语句 触发器不能被显式调用 触发器的功能: 自动生成数据 自定义复杂的安全权限 提供审计和日志记录 启用复杂...
  • oracle触发器

    2016-08-25 18:02:41
    1 触发器类型  触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,...
  • 问题描述: create table userinfo ( user_identity char(20)primary key, user_name char(10), user_sex char(2), user_age int check(user_age > 18 and user_age < 150), user_phone char(15),...
  • JavaScript触发器

    2019-11-10 19:06:15
    JavaScript触发器 一、功能 顾名思义就是操控鼠标或键盘触发(实现)一些特定功能。 二、功能实现 <script type="text/javascript"> var changeColor=function () { document.body.style....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,102
精华内容 12,040
关键字:

关于触发器描述错误的是