sqlite触发器(Trigger)
【定义】
sqlite 的触发器是数据库的回调函数,它会自动执行/指定的数据库事件发生时调用。以下是关于sqlite的触发器的要点: 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 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。
-
要修改的表必须存在于同一数据库中,作为触发器被附加的表或视图,且必须只使用tablename,而不是database.tablename。
【语法】
创建触发器(Trigger)的基本语法如下:
CREATETRIGGERtrigger_name[BEFORE|AFTER]event_name ONtable_name BEGIN --Triggerlogicgoeshere.... END;
在这里,event_name可以是在所提到的表table_name上的INSERT、DELETE 和 UPDATE数据库操作。您可以在表名后选择指定 FOR EACH ROW。
以下是在 UPDATE 操作上在表的一个或多个指定列上创建触发器(Trigger)的语法:
CREATETRIGGERtrigger_name[BEFORE|AFTER]UPDATEOFcolumn_name ONtable_name BEGIN --Triggerlogicgoeshere.... END;
【例子】
让我们假设一个情况,我们要为被插入到新创建的 COMPANY 表(如果已经存在,则删除重新创建)中的每一个记录保持审计试验:
sqlite>CREATETABLECOMPANY(
IDINTPRIMARYKEYNOTNULL,NAMETEXTNOTNULL,AGEINTNOTNULL,ADDRESSCHAR(50),SALARYREAL
);
为了保持审计试验,我们将创建一个名为 AUDIT 的新表。每当 COMPANY 表中有一个新的记录项时,日志消息将被插入其中:
sqlite>CREATETABLEAUDIT(
EMP_IDINTNOTNULL,ENTRY_DATETEXTNOTNULL
);
在这里,ID 是 AUDIT 记录的 ID,EMP_ID 是来自 COMPANY 表的 ID,DATE 将保持 COMPANY 中记录被创建时的时间戳。所以,现在让我们在 COMPANY 表上创建一个触发器,如下所示:
sqlite>CREATETRIGGERaudit_logAFTERINSERT
ONCOMPANY
BEGIN
INSERTINTOAUDIT(EMP_ID,ENTRY_DATE)VALUES(new.ID,datetime('now'));
END;
现在,我们将开始在 COMPANY 表中插入记录,这将导致在 AUDIT 表中创建一个审计日志记录。因此,让我们在 COMPANY 表中创建一个记录,如下所示:
sqlite>INSERTINTOCOMPANY(ID,NAME,AGE,ADDRESS,SALARY)
VALUES(1,'Paul',32,'California',20000.00);
这将在 COMPANY 表中创建如下一个记录:
IDNAMEAGEADDRESSSALARY
--------------------------------------------------
1Paul32California20000.0
同时,将在 AUDIT 表中创建一个记录。这个纪录是触发器的结果,这是我们在 COMPANY 表上的 INSERT 操作上创建的触发器(Trigger)。类似的,可以根据需要在 UPDATE 和 DELETE 操作上创建触发器(Trigger)。
EMP_IDENTRY_DATE
-----------------------------
12013-04-0506:26:00
【列出触发器(TRIGGERS)】
您可以从sqlite_master表中列出所有触发器,如下所示:
sqlite>SELECTnameFROMsqlite_master
WHEREtype='trigger';
上面的 sqlite 语句只会列出一个条目,如下:
name
----------
audit_log
如果您想要列出特定表上的触发器,则使用 AND 子句连接表名,如下所示:
sqlite>SELECTnameFROMsqlite_master
WHEREtype='trigger'ANDtbl_name='COMPANY';
上面的 sqlite 语句只会列出一个条目,如下:
name
----------
audit_log
【删除触发器】
下面是 DROP 命令,可用于删除已有的触发器:
sqlite>DROPTRIGGERtrigger_name;
【网上的例子】
--创建班级表
create table class
(
id integer primary key autoincrement,--班级编号
className nvarchar(50) --班级名称
);
--创建学生表
create table student
stuName nvarchar(20),--学生名称
stuSex bit,--性别
stuAge integer,--年龄
classId--班级编号
);
--创建插入触发器 (创建学生时要触发插入触发器去判断是否存在该班级,存在插入成功,反之插入失败)
create trigger fk_Insert
before insert on student
for each row
begin
select raise(rollback,'还没有该班级')
where (select id from class where id = new.classId ) is null;
end;
--创建更新触发器 (更新学生时要触发更新触发器去判断是否存在更新班级,存在更新成功,反之更新失败)
create trigger fk_Update
before update on student
for each row
begin
select raise(rollback,'还没有该班级')
where (select id from class where id = new.classId)is null;
end;
--创建删除触发器 (删除班级时,首先根据班级编号删除该班级学生)
create trigger fk_Delete
before delete on class
for each row
begin
delete from student where classId = old.classId;
end ;
insert into class(className) values('s1t64');
insert into student(stuName,stuSex,stuAge,classId)values('zhangsan',1,23,1);
update student set stuName='lishi',classId=1 where id = 1;
select * from class ;
select * from student limit 0,100 ; -- 分页查询从索引0开始查找,100条数据
@H_403_300@
【参考文档】
从网络上面下载了一个文档,是英文版的。但是感觉应该是sqlite的api。已经上传到了下载资源了。下载连接如下:
sqlite>SELECTnameFROMsqlite_master WHEREtype='trigger';
上面的 sqlite 语句只会列出一个条目,如下:
name ---------- audit_log
如果您想要列出特定表上的触发器,则使用 AND 子句连接表名,如下所示:
sqlite>SELECTnameFROMsqlite_master WHEREtype='trigger'ANDtbl_name='COMPANY';
上面的 sqlite 语句只会列出一个条目,如下:
name ---------- audit_log
【删除触发器】
下面是 DROP 命令,可用于删除已有的触发器:
sqlite>DROPTRIGGERtrigger_name;
【网上的例子】
--创建班级表
create table class
(
id integer primary key autoincrement,--班级编号
className nvarchar(50) --班级名称
);
--创建学生表
create table student
stuName nvarchar(20),--学生名称
stuSex bit,--性别
stuAge integer,--年龄
classId--班级编号
);
--创建插入触发器 (创建学生时要触发插入触发器去判断是否存在该班级,存在插入成功,反之插入失败)
create trigger fk_Insert
before insert on student
for each row
begin
select raise(rollback,'还没有该班级')
where (select id from class where id = new.classId ) is null;
end;
--创建更新触发器 (更新学生时要触发更新触发器去判断是否存在更新班级,存在更新成功,反之更新失败)
create trigger fk_Update
before update on student
for each row
begin
select raise(rollback,'还没有该班级')
where (select id from class where id = new.classId)is null;
end;
create table class
(
id integer primary key autoincrement,--班级编号
className nvarchar(50) --班级名称
);
--创建学生表
create table student
stuName nvarchar(20),--学生名称
stuSex bit,--性别
stuAge integer,--年龄
classId--班级编号
);
create trigger fk_Insert
before insert on student
for each row
begin
select raise(rollback,'还没有该班级')
where (select id from class where id = new.classId ) is null;
end;
--创建更新触发器 (更新学生时要触发更新触发器去判断是否存在更新班级,存在更新成功,反之更新失败)
create trigger fk_Update
before update on student
for each row
begin
select raise(rollback,'还没有该班级')
where (select id from class where id = new.classId)is null;
end;