①般般dē我①般般dē坏!└→1般般dē女孩我Bu愛 ljoanve==love+joan

触发器介绍(转)

上一篇 / 下一篇  2007-03-29 18:46:46

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

的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的51Testing软件测试网O+H j(e%? Tt

数据控制能力。数据库触发器有以下的作用:51Testing软件测试网~Bf*X&g5Q;R |mzp

    * 安全性。可以基于数据库的值使用户具有操作数据库的某种权51Testing软件测试网6p)c{?(CnOl5D

利。51Testing软件测试网bQC,iP(r s%Q"n

      # 可以基于时间限制用户的操作,例如不允许下班后和节假日51Testing软件测试网5o M]e6k7O(c_

      修改数据库数据。

(q9[X p!s/RC0

      # 可以基于数据库中的数据限制用户的操作,例如不允许股票51Testing软件测试网5N6WZdH;Hq7@

      的价格的升幅一次超过10%。51Testing软件测试网!l M(lE:D ^)}1E1Y3X

    * 审计。可以跟踪用户对数据库的操作。51Testing软件测试网 O0_\y'G

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

Q)U;gP*A2fs oj8m4^[0

      # 把用户对数据库的更新写入审计表。51Testing软件测试网}4? CX d;S

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

{/P.?(B*M%| K(xH0

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

CJ!K6Mj e7hg0

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

p^"E.kO8t?+h8U b0

      象。例如,触发器可回退任何企图吃进超过自己保证金的期货。51Testing软件测试网:z2u} gBB;Z(z

      # 提供可变的缺省值。51Testing软件测试网4s h t3bi

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

0M(aY@$w0

据库中相关的表进行连环更新。例如,在auths表author_code列上的51Testing软件测试网D/ox*L s

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

4q&m0Tl!l#HU m;q0

      # 在修改或删除时级联修改或删除其它表中的与之匹配的行。51Testing软件测试网m'o9]8J.L0ny

      # 在修改或删除时把其它表中的与之匹配的行设成NULL值。51Testing软件测试网2bG!^n@p

      # 在修改或删除时把其它表中的与之匹配的行级联设成缺省值。51Testing软件测试网VTkF} T

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

;h-d [0i0s Zr0

      图进行数据更新的事务。当插入一个与其主健不匹配的外部键51Testing软件测试网C*E&r4S$`m|

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

9D8fHeW qa+Y,h0

      列上生成一个插入触发器,如果新值与auths.author_code列51Testing软件测试网ae$g V4q4v

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

#n/Uo(n y0

    * 同步实时地复制表中的数据。51Testing软件测试网:c)V `Mp;J.M

    * 自动计算数据值,如果数据的值达到了一定的要求,则进行特51Testing软件测试网DY+DH nyI){B,w

定的处理。例如,如果公司的帐号上的资金低于5万元则立即给财务人51Testing软件测试网a%O"f?'[

员发送警告数据。51Testing软件测试网m*u?n;O(K

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

]l`'Y(r?0

这两种数据库触发器的作用和写法。51Testing软件测试网#m)]]2O I x

 

5v bN4N1|8{7P0

二 ORACLE 触发器51Testing软件测试网L'W;[3Fh9y

    ORACLE产生数据库触发器的语法为:51Testing软件测试网w hs `6w3_%mH RA\

    create [or replace] trigger 触发器名 触发时间 触发事件51Testing软件测试网 Qo[A,Y0[pM2h7Rr.L

      on 表名51Testing软件测试网 hv"FX!G'@8W ^H8k

      [for each row]51Testing软件测试网k/Xt R-G)hs8N{9u

      pl/sql 语句

b8@U*c#Hg+n0

    其中:51Testing软件测试网P8OW`1e:J?K8j

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

-uH}n kIe8_0

              的,因此该名称只是一个名称,没有实质的用途。51Testing软件测试网.my%Y}(i dFm-T| h

    触发时间:指明触发器何时执行,该值可取:51Testing软件测试网c)O%Y@sx#Y?D

              before---表示在数据库动作之前触发器执行;51Testing软件测试网 \^#gj'G

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

-p j X H"h'H-w@Ge0

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

4a)a(I {t&I0

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

x'Uy;c+y/iE0

              update:数据库修改会触发此触发器;51Testing软件测试网\!a$yf$e;O1t;{BY

              delete:数据库删除会触发此触发器。51Testing软件测试网D3e@ aq2x } a%x jW

    表    名:数据库触发器所在的表。51Testing软件测试网0My;Z(b*h1Z

    for each row:对表的每一行触发器执行一次。如果没有这一51Testing软件测试网4zT,Z%])\ v [}

                  选项,则只对整个表执行一次。51Testing软件测试网^,Tu@V4?sXE

    举例:下面的触发器在更新表auths之前触发,目的是不允许在51Testing软件测试网]"E;N,mN!sk

          周末修改表:51Testing软件测试网(}t1OIid

    create trigger auth_secure51Testing软件测试网7FKAw+}4w0p4P)K

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

Pc)N,Xf*DC/l0

      on auths

_7~f,F3C Qzg0

    begin51Testing软件测试网"u/GGM&K:A

      if(to_char(sysdate,'DY')='SUN'51Testing软件测试网R8gV0F4yP.M

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

0T&KEeC0

      end if;

?XF#X6] D0

    end51Testing软件测试网p:DVe SvA

  51Testing软件测试网WxB'K!\?*g)~

三 SYBASE数据库触发器51Testing软件测试网e5A^UP@ ]4SG n

    SYBASE数据库触发器的作用与ORACLE非常类似,仅有较小的差异。51Testing软件测试网!V!Xx eT&u8cy,O&i

    SYBASE产生触发器的语法为:51Testing软件测试网`3p@5KH#S^1{!c c

    CREATE TRIGGER 触发器名51Testing软件测试网O)^9rj b

      ON 表名

3eGb mI4x0

      FOR INSERT,UPDATE,DELETE51Testing软件测试网(A#O5]u)tU|\'\

      AS 51Testing软件测试网 N!u [-c.L3S

      SQL_statement |

7y mP%_0R6oA9t`0

      FOR INSERT,UPDATE

L0a `+]O p M:}4s+@hI0

      AS

c3`)hde0qVs0

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

4Yx(G0Xy2M0

      SQL_statements51Testing软件测试网f~k"hs

    上面FOR子句用来指定在触发器上的哪些数据更新命令可激活该51Testing软件测试网vGlf#uMS{0y

触发器。IF UPDATE子句检查对指定列的操作类型,在IF UPDATE子句51Testing软件测试网3_2UP3[*k}

中可指定多个列。51Testing软件测试网T9e%i'T In_0PQ

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

W"g,e a0~0wC0

在数据更新语句完成以后立即执行。触发器和启动它的语句被当作一51Testing软件测试网 q[n}G9R v

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

)F ~\W1|3Qkyx,P0

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

k(l k`BJ0

    create trigger forinsert_books

RN Sd.H(dp6yB0

      on books

"wkjsnz!TmD0

      for insert

"|y(|s Mz&r.s6^0

      as

#t6az!J2GfIEM0

      if(select count(*) from auths,inserted

6Z VaLFlwR0

        where auths.author_code=insert.author_code)!=@@rowcount51Testing软件测试网 g(rEF jO

      begin51Testing软件测试网^tZIBe_L

        rollback transaction51Testing软件测试网$HU6^{8|

        print "books 表中 author_code 列的值在auths 表中不存在。"51Testing软件测试网;eClK!`'Y7z5j%b5u%[

      end51Testing软件测试网4T a]*y P\#}&p7x


R]om&@&yY5{ I0

,X,U5z9Zr"}N:x~ n0

TAG:

 

评分:0

我来说两句

日历

« 2024-05-14  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 23217
  • 日志数: 44
  • 图片数: 6
  • 建立时间: 2007-03-03
  • 更新时间: 2007-04-14

RSS订阅

Open Toolbar