sqlite 触发器
sqlite 触发器(trigger)是数据库的回调函数,它会在指定的数据库事件发生时自动执行/调用。以下是关于 sqlite 的触发器(trigger)的要点:
- sqlite 的触发器(trigger)可以指定在特定的数据库表发生 delete、insert 或 update 时触发,或在一个或多个指定表的列发生更新时触发。
- sqlite 只支持 for each row 触发器(trigger),没有 for each statement 触发器(trigger)。因此,明确指定 for each row 是可选的。
- when 子句和触发器(trigger)动作可能访问使用表单 new.column-name 和 old.column-name 的引用插入、删除或更新的行元素,其中 column-name 是从与触发器关联的表的列的名称。
- 如果提供 when 子句,则只针对 when 子句为真的指定行执行 sql 语句。如果没有提供 when 子句,则针对所有行执行 sql 语句。
- before 或 after 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。
- 当触发器相关联的表删除时,自动删除触发器(trigger)。
- 要修改的表必须存在于同一数据库中,作为触发器被附加的表或视图,且必须只使用 tablename,而不是 database.tablename。
- 一个特殊的 sql 函数 raise() 可用于触发器程序内抛出异常。
1. 语法
创建 触发器(trigger) 的基本语法如下:
create trigger trigger_name [before|after] event_name on table_name begin -- 触发器逻辑.... end;
在这里,event_name 可以是在所提到的表 table_name 上的 insert、delete 和 update 数据库操作。您可以在表名后选择指定 for each row。
以下是在 update 操作上在表的一个或多个指定列上创建触发器(trigger)的语法:
create trigger trigger_name [before|after] update of column_name on table_name begin -- 触发器逻辑.... end;
让我们假设一个情况,我们要为被插入到新创建的 company 表(如果已经存在,则删除重新创建)中的每一个记录保持审计试验:
sqlite> create table company( id int primary key not null, name text not null, age int not null, address char(50), salary real );
为了保持审计试验,我们将创建一个名为 audit 的新表。每当 company 表中有一个新的记录项时,日志消息将被插入其中:
sqlite> create table audit( emp_id int not null, entry_date text not null );
在这里,id 是 audit 记录的 id,emp_id 是来自 company 表的 id,date 将保持 company 中记录被创建时的时间戳。所以,现在让我们在 company 表上创建一个触发器,如下所示:
sqlite> create trigger audit_log after insert on company begin insert into audit(emp_id, entry_date) values (new.id, datetime('now')); end;
现在,我们将开始在 company 表中插入记录,这将导致在 audit 表中创建一个审计日志记录。因此,让我们在 company 表中创建一个记录,如下所示:
sqlite> insert into company (id,name,age,address,salary) values (1, 'paul', 32, 'california', 20000.00 );
这将在 company 表中创建如下一个记录:
id name age address salary ---------- ---------- ---------- ---------- ---------- 1 paul 32 california 20000.0
同时,将在 audit 表中创建一个记录。这个纪录是触发器的结果,这是我们在 company 表上的 insert 操作上创建的触发器(trigger)。类似的,可以根据需要在 update 和 delete 操作上创建触发器(trigger)。
emp_id entry_date ---------- ------------------- 1 2013-04-05 06:26:00
2. 列出触发器(triggers)
您可以从 sqlite_master 表中列出所有触发器,如下所示:
sqlite> select name from sqlite_master where type = 'trigger';
上面的 sqlite 语句只会列出一个条目,如下:
name ---------- audit_log
如果您想要列出特定表上的触发器,则使用 and 子句连接表名,如下所示:
sqlite> select name from sqlite_master where type = 'trigger' and tbl_name = 'company';
上面的 sqlite 语句只会列出一个条目,如下:
name ---------- audit_log
3. 删除触发器(triggers)
下面是 drop 命令,可用于删除已有的触发器:
sqlite> drop trigger trigger_name;