SQLite 触发器

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-nameold.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;

下一节:sqlite 索引

sqlite教程

相关文章