admin管理员组

文章数量:1612437

2024年7月4日发(作者:)

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

可以使用"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 = s WHERE customer_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删除触发器。

本文标签: 触发器语句数据库