【问题标题】:Create trigger for sqlite database that prevents insert为防止插入的sqlite数据库创建触发器
【发布时间】:2013-04-13 02:16:36
【问题描述】:

我正在尝试为代表学校的 sqlite 数据库创建触发器。我有一个名为 Administrators 的表,其架构如下:

CREATE TABLE Administrators(
ssn INT CHECK(ssn > 100000000),
lName CHAR(20),
fName CHAR(10),
gender CHAR(1) CHECK(gender IN('F','M')),
dob DATE,
address CHAR(100),
phone INT CHECK(phone > 1000000000),
role CHAR(20) CHECK(role IN('Principal','Vice Principal','Dean')),
PRIMARY KEY(ssn)
);

我想确保只有一个委托人。我已经尝试了所有我能想到的方法,并且在触发器的各个位置不断出现错误。我试过的最后一个说“IF”附近有一个错误

sqlite> CREATE TRIGGER onePres
   ...> BEFORE INSERT ON Administrators
   ...> BEGIN
   ...> IF (EXISTS (SELECT * FROM Administration WHERE role = 'Principal'))
   ...> BEGIN
   ...> ROLLBACK TRANSACTION;
   ...> RETURN
   ...> END;
   ...> END;

谁能帮我弄清楚我做错了什么? 谢谢!

【问题讨论】:

  • SSN 和电话号码没有数值;使用字符串。

标签: sql database triggers sqlite


【解决方案1】:

trigger documentation;您只能在触发器中使用 SELECTINSERTUPDATEDELETE 语句。

要引发错误,请使用 SELECT 内部的 RAISE 函数:

CREATE TRIGGER onePres
BEFORE INSERT ON Administrators
FOR EACH ROW
WHEN NEW.role = 'Principal'
BEGIN
    SELECT RAISE(ABORT, 'There can be only one.')
    WHERE EXISTS (SELECT 1
                  FROM Administrators
                  WHERE role = 'Principal');
END;

(您还需要检查UPDATEs。)

【讨论】:

    【解决方案2】:

    一种简单的方法是,您可以先检查数据库是否存在任何作为主体的人,然后执行必要的操作

    为这种微不足道的任务编写触发器是一种矫枉过正

    【讨论】:

    • 然后遇到并发问题。此外,您必须记住,每次插入内容时都必须检查此类条件。
    猜你喜欢
    • 2011-05-14
    • 2017-04-26
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多