2014-06-17 26 views
0

我需要參數化一個視圖,我通過創建一個具有視圖參數的TEMP TABLE來實現。在VIEW上觸發器中訪問TEMP TABLE

CREATE TEMP TABLE parms (parm1 INTEGER, parm2 INTEGER); 
CREATE VIEW tableview AS ... 

VIEW是相當複雜的,但它基本上使用這兩個參數來啓動一個遞歸CTE,並沒有說我已經找到表達沒有這些參數視圖中的任何其他方式。

參數必須存儲在臨時表中,因爲每個連接都應該能夠使用不同的參數來擁有自己的視圖。

在任何情況下,這工作正常創建視圖本身,只要我創建相同TEMP TABLE在使用該視圖的任何查詢,如開始:我能做到

CREATE TEMP TABLE parms (parm1 INTEGER, parm2 INTEGER); 
INSERT INTO parms (parm1,parm2) VALUES (5,66); 
SELECT * FROM tableview; 

同樣的事情,以創建一個觸發器,以允許在視圖插入:

CREATE TEMP TABLE parms (parm1 INTEGER, parm2 INTEGER); 
CREATE TRIGGER tableinsert INSTEAD OF INSERT ON tableview ... 

然而,當我嘗試做一個實際的INSERT(重新創建TEMP TABLE首先作爲前)我得到一個錯誤:

no such table: main.parms 

如果我創建一個非臨時表,我不會得到這個錯誤,但然後我有問題,不同的連接不能有自己單獨的視圖。

我已閱讀documentation for triggers,它提到了在非臨時表上使用臨時觸發器的注意事項,但我沒有看到有關反向的任何內容。

我確實在其他地方找到了一個引用,表明「該表...必須與觸發器所附的表或視圖存在於同一個數據庫中」。我認爲臨時表是當前數據庫的一部分,這是不是真的?有什麼方法可以使這個真實嗎?

我也試過訪問parms表作爲temp.parms在觸發器,但得到的錯誤:

qualified table names are not allowed on INSERT, UPDATE, and DELETE 
statements within triggers 

如果我不能使用臨時表,是有一些方法來解決它來完成一樣?

更新:好的,所以它似乎是一個SQLite的限制。在SQLite源代碼中挖掘了一下之後,似乎很容易讓SELECT訪問觸發器中的臨時表。但是,允許UPDATE訪問似乎要困難得多。

回答

1

臨時對象在名爲temp的單獨數據庫中創建,因此無法從其他數據庫中的觸發器訪問它們。

將特定於連接的值存入觸發器的其餘機制是使用用戶定義的函數。