2016-01-03 20 views
2

有没有什么办法来写sqlite的SQL输入文件,以某种方式“抛出”一个错误,例如。如果条件不符合,退出交易回滚?SQLITE:停止执行,如果选择返回特定的值

我有一个应该做某事的脚本,但只有在某个表中有特定行的情况下。如果它不在那里,脚本的执行可能会导致致命的结果并损坏分贝。

脚本现在只在需求时启动,但我更愿意添加一个故障安全防护,以防在出现问题时阻止其执行。

基本上我需要的是像

/* IF */ SELECT value FROM meta WHERE key = 'version' /* != hardcoded_version_string THROW SOME EXCEPTION */ 

有没有办法来实现这一目标?在Postgre/Oracle中,这可以使用PLSQL完成,但我不确定sqlite是否支持这样的事情?

回答

1

Triggers可以使用RAISE功能产生错误:

CREATE VIEW test AS SELECT NULL AS value; 
CREATE TRIGGER test_insert 
INSTEAD OF INSERT ON test 
BEGIN 
    SELECT RAISE(FAIL, 'wrong value') 
    WHERE NEW.value != 'fixed_value'; 
END; 

INSERT INTO test SELECT 'fixed_value'; 
INSERT INTO test SELECT 'whatever'; 
Error: wrong value 
1

有没有办法写一个SQL输入文件sqlite的那会 有点“抛”的错误,例如。退出交易回滚,如果 条件不符合?

一个解决办法可能是创建虚拟表,并明确违反NULL约束:

CREATE TABLE meta("key" VARCHAR(100)); 
INSERT INTO meta("key") VALUES ('version'); 

CREATE TEMPORARY TABLE dummy(col INT NOT NULL); 

交易:

BEGIN TRANSACTION; 

INSERT INTO dummy(col) 
SELECT NULL     -- explicit insert of NULL 
FROM meta 
WHERE "key" = 'version'; 
-- Error: NOT NULL constraint failed: dummy.col 

-- rest code 
INSERT INTO meta("key") 
VALUES ('val1'); 

INSERT INTO meta("key") 
VALUES ('val2'); 
-- ... 

COMMIT; 

SqlFiddleDemo

请记住,SQLite不是过程语言,这个解决方案有点难看。

相关问题