设为首页 收藏本站
查看: 821|回复: 0

[经验分享] SQLite语法 CREATE TRIGGER

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-11-30 06:37:58 | 显示全部楼层 |阅读模式
  转载自:
  http://blog.csdn.net/JinHuanBaobei/archive/2009/07/07/4326814.aspx
  



CREATE TRIGGER


sql-statement

 ::=

CREATE

[TEMP

|
TEMPORARY

] TRIGGER

trigger-name



[ BEFORE

|
AFTER

]


database-event

ON

[database-name

.


]

table-name




trigger-action



sql-statement

 ::=

CREATE

[TEMP

|
TEMPORARY

] TRIGGER

trigger-name

INSTEAD OF


database-event

ON

[database-name

.


]

view-name




trigger-action



database-event

 ::=

DELETE

|


INSERT


|


UPDATE


|


UPDATE OF


column-list



trigger-action

 ::=
[ FOR EACH ROW

|
FOR EACH STATEMENT

]

[ WHEN

expression



]

BEGIN

    


trigger-step

;

[

trigger-step

;

]*


END




trigger-step

 ::=

update-statement



|


insert-statement



|



delete-statement



|


select-statement

  CREATE TRIGGER语句用于向数据库schema中添加触发器。触发器是一些在特定的数据库事件(database-event
) 发生时自动进行的数据库操作(trigger-action
).
  触发器可由在特殊表上执行的DELETE, INSERT, UPDATE等语句触发,或UPDATE表中特定的字段时触发。
  现在SQLite仅支持FOR EACH ROW触发器,不支持FOR EACH STATEMENT触发。因此可以不用明确说明FOR EACH ROW .FOR EACH ROW的意思是由trigger-steps
说明的SQL语句可能在(由WHEN子句决定的)数据库插入,更改或删除的每一行触发trigger.
  WHEN子句和trigger-steps
可以使用"NEW.column-name
"和"OLD.column-name
"的引用形式访问正在被插入,更改或 删除的行的元素,column-name
是触发器关联的表中的字段名。OLD 和 NEW 引用只在触发器与之相关的trigger-event
处可用,例如:


INSERT
NEW可用

UPDATE
NEW和OLD均可用

DELETE
OLD可用
  当使用WHEN子句,trigger-steps
只在WHEN子句为真的行执行。不使用WHEN时则在所有行执行。
  trigger-time
决定了trigger-steps
执行的时间,它是相对于关联行的插入,删除和修改而言的。
  作为的一部分trigger-step
的UPDATE 或 INSERT可以使用ON CONFLICT子句。 但若触发trigger的语句使用了ON CONFLICT子句,则覆盖前述的ON CONFLICT子句所定义的冲突处理方法。
  关联表被撤销时触发器被自动删除。
  不仅在表上,在视图上一样可以创建触发器,在CREATE TRIGGER语句中使用INSTEAD OF即可。 若视图上定义了一个或多个ON
INSERT, ON DELETE, ON UPDATE触发器,则相应地对视图执行INSERT,DELETE 或UPDATE语句
不会出错,而会触发关联的触发器。视图关联的表不会被修改。(除了由触发器进行的修改操作)。
  Example:

  假设"customers"表存储了客户信息,"orders"表存储了订单信息,下面的触发器确保当用户改变地址时所有的 关联订单地址均进行相应改变:



CREATE TRIGGER update_customer_address UPDATE OF address ON customers  
BEGIN
UPDATE orders SET address = new.address WHERE customer_name = old.name;
END;

  定义了该触发器后执行如下语句:



UPDATE customers SET address = ’1 Main St.’ WHERE name = ’Jack Jones’;

  会使下面的语句自动执行:



UPDATE orders SET address = ’1 Main St.’ WHERE customer_name = ’Jack Jones’;

  注意,目前在有INTEGER PRIMARY KEY域的表上触发器可能工作不正常。若BEFORE触发器修改了一行的 INTEGER
PRIMARY KEY域,而该域将由触发该触发器的语句进行修改,则可能根本不会修改该域。 可以用PRIMARY KEY字段代替INTEGER
PRIMARY KEY字段来解决上述问题。
  一个特殊的SQL函数RAISE()可用于触发器程序,使用如下语法:


raise-function

 ::=

RAISE (
ABORT,


error-message

)


|


RAISE (
FAIL,


error-message

)


|


RAISE (
ROLLBACK,


error-message

)


|


RAISE (
IGNORE )


  当触发器程序执行中调用了上述前三个之一的形式时,则执行指定的ON CONFLICT进程(ABORT, FAIL或者ROLLBACK) 且终止当前查询,返回一个SQLITE_CONSTRAINT错误并说明错误信息。
  当调用RAISE(IGNORE),当前触发器程序的余下部分,触发该触发器的语句和任何之后的触发器程序被忽略并且 不恢复对数据库的已有改变。 若触发触发器的语句是一个触发器程序本身的一部分,则原触发器程序从下一步起继续执行。
  使用DROP TRIGGER
删除触发器。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-307295-1-1.html 上篇帖子: SQLite Blob读写的局限性 下篇帖子: android SQLite编程详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表