小。速度很快。可靠。
选择任意三个选项。
创建触发器

1语法

创建触发器:

创建 临时雇员 临时 触发 国际单项体育联合会 不是 存在 方案名称 . 触发器名称 之前 之后 INSTEAD公司 第页,共页 删除 插入 更新 第页,共页 列名 , 打开 表格名称 适用于 每个 世界其他地区 什么时候 快递 开始 更新-状态 ; 结束 插入语句 删除报表 select-stmt(选择-测试)

删除语句:

快递:

插入语句:

select-stmt(选择-测试):

更新-状态:

2描述

CREATE TRIGGER语句用于将触发器添加到数据库模式。触发器是数据库操作当指定的数据库事件发生时自动执行发生。

每个触发器必须指定它将为以下其中一个触发以下操作:删除,插入,更新.对于删除、插入、,或已更新。如果“更新列名"使用语法,则触发器仅在以下情况下触发列名显示在的左侧的SET子句中的一个术语更新声明。

由于历史疏忽,在“UPDATE OF”中命名的列子句实际上不必存在于正在更新的表中。无法识别的列名将被自动忽略。如果SQLite未能通过CREATE TRIGGER,则会更有帮助语句,如果“UPDATE of”子句中的任何名称不是表中的列。然而,当这个问题被发现时SQLite被广泛部署多年后,我们一直抵制解决问题,以免破坏遗留应用程序。

目前,SQLite只支持FOR EACH ROW触发器,而不支持FOR EA语句触发器。因此,显式指定FOR EACH ROW是可选的。FOR EACH ROW表示触发器中指定的SQL语句可以对以下每个数据库行执行(取决于WHEN子句)由导致触发触发器的语句插入、更新或删除。

WHEN子句和触发器操作都可以访问使用表单引用插入、删除或更新的行“新增。列名和“旧”。列名“,其中列名是触发器所在表中的列的名称与关联。OLD和NEW引用只能在上的触发器中使用相关事件如下:

插入 新的参考文献有效
更新 新的和旧的参考有效
删除 旧引用有效

如果提供了WHEN子句,则指定SQL语句只有当WHEN子句为true时才执行。如果未提供WHEN子句,则SQL语句每次触发触发器时都会执行。

BEFORE或AFTER关键字确定触发操作的时间将相对于插入、修改或删除关联行。当两个关键字都不存在时,BEFORE是默认值。

论冲突条款可以指定为更新插入触发器主体内的操作。然而,如果论冲突子句被指定为导致触发器触发的语句,然后进行冲突处理而是使用外部语句的策略。

触发器是自动的下降当他们在桌子上时与(表格名称表)是下降。但是,如果触发器操作引用其他表,则不会删除或修改触发器表格是下降修改的.

使用删除触发器跌落触发器声明。

2.1、。中UPDATE、DELETE和INSERT语句的语法限制触发器

这个更新,删除、和插入触发器中的语句不支持的完整语法更新,删除、和插入声明。以下内容限制适用:

三。代替触发器

BEFORE和AFTER触发器仅适用于普通表。INSTEAD OF触发器仅适用于视图。

如果视图上存在INSTEAD OF INSERT触发器,则它是可以对该视图执行INSERT语句。没有实际的插入发生。相反,触发器中包含的语句正在运行。代替删除和INSTEAD OF UPDATE触发器对DELETE和UPDATE语句的工作方式相同反对观点。

请注意sqlite3_changes()sqlite3_total_changes()接口不计算INSTEAD OF触发器触发,但count_changes杂注计数INSTEAD OF触发器触发。

4一些示例触发器

假设客户记录存储在“customers”表中,并且订单记录存储在“订单”表中,如下所示UPDATE触发器确保在客户更改时重定向所有关联的订单他或她的地址:

创建触发器update_customer_address更新客户的地址开始更新订单SET address=new.address WHERE customer_name=old.name;结束;

安装此触发器后,执行以下语句:

更新客户SET address='1 Main St.'WHERE name='Jack Jones';

使以下内容自动执行:

更新订单SET address='1 Main St.'WHERE customer_name='Jack Jones';

对于INSTEAD of触发器的示例,请考虑以下模式:

CREATE TABLE客户(cust_id整数主键,客户名称文本,客户地址文本);创建VIEW customer_address AS从客户中选择cust_id、cust_addr;创建触发器cust_addr_chng代替在customer_address上更新cust_addr开始更新客户集合cust_addr=NEW.cust_addr其中cust_id=NEW.cust_id;结束;

使用上面的模式,一条语句的形式为:

更新customer_address设置cust_addr=$new_address,其中cust_id=$cust_id;

使customer.cust_addr字段针对特定的customer.custid等于$custid参数的客户条目。请注意分配给视图的值是如何作为字段提供的在触发器主体内的特殊“NEW”表中。

5关于使用BEFORE触发器的注意事项

如果BEFORE UPDATE或BEFORE DELETE触发器修改或删除行将被更新或删除,然后更新或删除操作未定义。此外,如果BEFORE触发器修改或删除行,则未定义AFTER是否触发否则会在这些行上运行,但实际上会运行。

在BEFORE INSERT触发器中未定义NEW.rowid的值,其中rowid未显式设置为整数。

由于上述行为,我们鼓励程序员首选AFTER触发器而不是BEFORE触发器。

6RAISE()函数

在触发程序中可以使用特殊的SQL函数RAISE(),使用以下语法

raise函数:

RAISE(升起) ( 回降 , 错误消息 ) IGNORE公司 中止 失败

当RAISE(ROLLBACK,…)、RAISE在触发程序期间调用执行,指定论冲突进行处理,并且当前查询终止。错误代码为SQLITE_CONSTRAINT公司返回到应用程序,以及指定的错误消息。

当调用RAISE(IGNORE)时,当前触发器程序的其余部分,导致触发程序执行的语句以及任何后续语句本应被执行的触发程序被放弃。没有数据库更改被回滚。如果引发触发程序的语句执行本身是触发程序的一部分,然后是该触发程序在下一步开始时继续执行。

7非TEMP表上的TEMP触发器

触发器通常与名为的表存在于同一数据库中在CREATE TRIGGER语句中的“ON”关键字之后。除了,它是可以在另一个数据库的表上创建TEMP TRIGGER。这样的触发器仅在更改时触发由定义触发器的应用程序生成目标表。修改数据库的其他应用程序将无法看到TEMP触发器,因此无法运行该触发器。

在非TEMP表上定义TEMP触发器时,重要的是指定保存非TEMP表的数据库。例如,在下面的语句中,重要的是改为说“main.tab1”仅“tab1”:

插入后创建温度触发器ex1主要。选项卡1开始。。。

可能导致在目标表上指定架构名称失败将TEMP触发器重新附加到中具有相同名称的表每当发生任何模式更改时,都会使用另一个数据库。

此页面上次修改时间2022-12-21 04:58:30联合技术公司