SQLite语法 CREATE TRIGGER

SQLite语法 CREATE TRIGGER,第1张

概述时间: 2009-08-14 21:18:18 来源: 网络 作者: 未 知 点击: 214 次 CREATE TRIGGER                           sql-statement ::=             CREATE [TEMP | TEMPORARY] TRIGGER trigger-name [ BEFORE | AFTER ]             da
时间: 2009-08-14 21:18:18 来源: 网络 作者: 未 知 点击: 214@H_419_15@ 次 CREATETRIGGER



sql-statement::=
CREATE[TEMP|TEMPORARY]TRIGGERtrigger-name[BEFORE|AFTER]
database-eventON[database-name.]table-name
CREATE TRIGGER@H_419_15@ @H_419_15@
sql-statement ::=@H_419_15@ @H_419_15@ CREATE [TEMP | TEMPORARY ] TRIGGER trigger-name [ BEFORE | AFTER ]
database-event ON [database-name . ] table-name
trigger-action @H_419_15@ @H_419_15@
sql-statement ::=@H_419_15@ @H_419_15@ CREATE [TEMP | TEMPORARY ] TRIGGER trigger-name INSTEAD OF
database-event ON [database-name . ] vIEw-name
trigger-action @H_419_15@ @H_419_15@
database-event ::=@H_419_15@ @H_419_15@ DELETE |
INSERT |
UPDATE |
UPDATE OF column-List @H_419_15@ @H_419_15@
trigger-action ::=@H_419_15@ @H_419_15@ [ FOR EACH ROW | FOR EACH STATEMENT ] [ WHEN Expression ]
BEGIN
trigger-step ; [ trigger-step ; ]*
END @H_419_15@ @H_419_15@
trigger-step ::=@H_419_15@ @H_419_15@ update-statement | insert-statement |
delete-statement | select-statement @H_419_15@ @H_419_15@

CREATE TRIGGER语句用于向数据库schema中添加触发器。触发器是一些在特定的数据库事件(database-event ) 发生时自动进行的数据库 *** 作(trigger-action ). @H_419_15@ @H_419_15@

触发器 可由在特殊表上执行的DELETE,INSERT,UPDATE等语句触发,或UPDATE表中特定的字段时触发。@H_419_15@ @H_419_15@

现在 sqlite仅支持FOR EACH ROW触发器,不支持FOR EACH STATEMENT触发。因此可以不用明确说明FOR EACH ROW .FOR EACH ROW的意思是由trigger-steps 说明的SQL语句可能在(由WHEN子句决定的)数据库插入,更改或删除 的每一行触发trigger.@H_419_15@ @H_419_15@

WHEN 子句和trigger-steps 可以使用"NEW.column-name "和"olD.column-name " 的引用形式访问正在被插入,更改或 删除的行的元素,column-name 是触发器关联的表中的字段名。olD 和 NEW 引用只在触发器与之相关的trigger-event 处可用,例如:@H_419_15@ @H_419_15@

INSERT @H_419_15@ @H_419_15@ NEW可用@H_419_15@ @H_419_15@
UPDATE @H_419_15@ @H_419_15@ NEW和olD均可用@H_419_15@ @H_419_15@
DELETE @H_419_15@ @H_419_15@ olD可用@H_419_15@ @H_419_15@

当使用 WHEN子句,trigger-steps 只在WHEN子句为真的行执行。不使用WHEN时则在所有行执行。@H_419_15@ @H_419_15@

trigger-time 决 定了trigger-steps 执行的时间,它是相对于关联行的插入,删除和修改而言的。@H_419_15@ @H_419_15@

作为的 一部分trigger-step 的UPDATE 或 INSERT可以使用ON CONFliCT子句。 但若触发trigger的语句使用了ON CONFliCT子句,则覆盖前述的ON CONFliCT子句所定义的冲突处理方法。@H_419_15@ @H_419_15@

关联表 被撤销时触发器被自动删除。@H_419_15@ @H_419_15@

不仅在 表上,在视图上一样可以创建触发器,在CREATE TRIGGER语句中使用INSTEAD OF即可。 若视图上定义了一个或多个ON INSERT,ON DELETE,ON UPDATE触发器,则相应地对视图执行INSERT,DELETE 或UPDATE语句 不会出错,而会触发关联的触发器。视图关联的表不会被修改。(除了由触发器进行的修改 *** 作)。@H_419_15@ @H_419_15@

Example: @H_419_15@ @H_419_15@

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

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

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

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

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

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

注意, 目前在有INTEGER PRIMARY KEY域的表上触发器可能工作不正常。若BEFORE触发器修改了一行的 INTEGER PRIMARY KEY域,而该域将由触发该触发器的语句进行修改,则可能根本不会修改该域。 可以用PRIMARY KEY字段代替INTEGER PRIMARY KEY字段来解决上述问题。@H_419_15@ @H_419_15@

一个特 殊的sql函数RAISE()可用于触发器程序,使用如下语法:@H_419_15@ @H_419_15@

raise-function ::=@H_419_15@ @H_419_15@ RAISE ( ABORT, error-message ) |
RAISE ( FAIL, error-message ) |
RAISE ( RolLBACK, error-message ) |
RAISE ( IGnorE ) @H_419_15@ @H_419_15@

当触发 器程序执行中调用了上述前三个之一的形式时,则执行指定的ON CONFliCT进程(ABORT,FAIL或者RolLBACK) 且终止当前查询,返回一个sqlITE_CONSTRAINT错误并说明错误信息。@H_419_15@ @H_419_15@

当调用 RAISE(IGnorE),当前触发器程序的余下部分,触发该触发器的语句和任何之后的触发器程序被忽略并且 不恢复对数据库的已有改变。 若触发触发器的语句是一个触发器程序本身的一部分,则原触发器程序从下一步起继续执行。 @H_419_15@ @H_419_15@

使用 DROP TRIGGER删除触发器。@H_419_15@ @H_419_15@

总结

以上是内存溢出为你收集整理的SQLite语法 CREATE TRIGGER全部内容,希望文章能够帮你解决SQLite语法 CREATE TRIGGER所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1177833.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存