位置:首页 > > SQLite TRIGGERS/触发器

SQLite TRIGGERS/触发器

SQLite的触发器是数据库的回调函数,它会自动执行/指定的数据库事件发生时调用。以下是关于SQLite的触发器的要点:

  • SQLite的触发器可以指定消防每当一个DELETE,INSERT或UPDATE一个特定的数据库表时或在一个或多个指定表的列发生更新。

  • 这时,SQLite支持FOR EACH ROW触发,没有FOR EACH STATEMENT触发器。因此,明确指定FOR EACH ROW是可选的。

  • WHEN子句和触发器动作可能访问的行元素被插入,删除或更新使用的形式NEW.column名称OLD.column-name,其中列名是从表中的列名的引用该触发器相关联的。

  • 如果提供WHEN子句指定的SQL语句只执行的行的WHEN子句为真。如果没有提供WHEN子句,SQL语句执行的所有行。

  • 决定何时触发动作将被执行插入,修改或删除相关的行之前或之后的关键字。

  • 触发器表,它们丢弃时自动删除。

  • 要修改的表必须存在,在同一数据库中的表或视图,触发器被附加,必须使用表名不database.tablename。

  • 一个特殊的SQL函数RAISE() 可用于触发器程序内引发异常。

语法

创建触发器的基本语法如下:

CREATE  TRIGGER trigger_name [BEFORE|AFTER] event_name 
ON table_name
BEGIN
 -- Trigger logic goes here....
END;

在这里,event_name 可能是INSERT,DELETE和UPDATE操作所提到的表table_name数据库。您可以选择指定FOR EACH ROW表名后。

以下是语法上创建一个触发器UPDATE操作一个或多个指定一个表列如下:

CREATE  TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name 
ON table_name
BEGIN
 -- Trigger logic goes here....
END;

例子

让我们考虑一个情况下,我们要保持审核COMPANY表中的每一条记录被插入我们新创建如下(如果已经拥有它,删除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是的审计记录ID,EMP_ID的ID将来自COMPANY表和日期将保持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 );

This will create one record in COMPANY table, which is as follows:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0

同时,将创造一个记录AUDIT表中。这个纪录是触发的结果,这是我们对COMPANY表上创建INSERT操作。类似的方式,可以创建触发器,UPDATE和DELETE操作根据要求。

EMP_ID      ENTRY_DATE
----------  -------------------
1           2013-04-05 06:26:00

列出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

删除 TRIGGERS

以下是DROP命令,它可以用来删除一个现有的触发器:

sqlite> DROP TRIGGER trigger_name;