2016-01-03 28 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不是過程語言,這個解決方案有點難看。

相關問題