SQLite 触发器的SQL语法
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可以使用"lumn-name"和"lumn-name" 的引用形式访问正在被插入,更改或 删除的行的元素,column-name是触发器关联的表中的字段名。OLD 和 NEW 引用只在触发器与之相关的trigger-event 处可用,例如:
INSERT NEW可用
sql触发器的使用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删除触发器。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论