Oracle
Oracle 靜態查找表
創建靜態表或視圖的最佳方法是什麼(或者我不知道哪些選項),其中數據很少(如果有的話)更改?一個範例案例是美國各州的列表,我的結構如下所示:
state( id NUMBER(15) PRIMARY KEY, name VARCHAR2(35), abbreviation VARCHAR2(35) )
我目前正在評估的兩種方法是:
使用一次性數據導入腳本創建表並插入所需數據
CREATE TABLE state ( id NUMBER(15) PRIMARY KEY, name VARCHAR2(35), abbreviation VARCHAR2(2) ); INSERT INTO state (id, name, abbreviation) VALUES (1, 'California', 'CA'); ...
擔憂:數據很容易被操縱,修改這些記錄會破壞軟體的其他部分
使用硬編碼值的聯合創建視圖
CREATE OR REPLACE VIEW state AS SELECT 1 AS id, 'California' AS name, 'CA' AS abbreviation FROM dual UNION SELECT 2 AS id, 'New York' AS name, 'NY' AS abbreviation FROM dual UNION ...
關注點:維護,輸入時可能出現錯誤(例如,與使用序列和触發器填充 id 不同),而且感覺不太對勁
數據是否可以被使用者操作取決於他擁有的權限。對錶和視圖等數據庫對象的權限直接授予使用者或通過角色授予。角色的優點是您可以輕鬆地將它們分配給新使用者,而無需處理細節。我建議至少有兩個角色:管理員角色和使用者角色。
CREATE ROLE myApp_Admin; CREATE ROLE myApp_User;
為角色分配權限:
GRANT SELECT, INSERT, UPDATE, DELETE ON state TO myApp_Admin; GRANT SELECT ON state TO myApp_User; -- ... grant rights to other tables and views here ...
然後,將這些角色分配給使用者
GRANT myApp_Admin TO invertigo; GRANT myApp_User TO someoneElse;
擔憂:數據很容易被操縱,修改這些記錄會破壞軟體的其他部分。
如果數據庫經過精心設計,則不應如此。如果您使用參照完整性,則使用者不應以破壞應用程序的方式操作數據。如果您有一個
employee
引用的表state
,則在此列上定義一個外鍵約束:ALTER TABLE employee ADD CONSTRAINT FK_emp_sta_myApp FOREIGN KEY (state_id) REFERENCES state.id;
id
使用此約束,只要在 中引用狀態,就無法刪除或更改狀態employee
。解決此問題的一種完全不同的方法是在您的數據庫中根本沒有查找表(或視圖),而是將查找資訊保留在您的應用程序中(例如,作為嵌入式 xml 資源)。
另一個解決方案:
將表創建為另一個 oracle 所有者,並將選擇權限授予您通常的應用程序所有者。然後,您可以在此處創建視圖。
CONNECT otherOwner; CREATE TABLE state (...); GRANT SELECT ON state TO appOwner WITH GRANT OPTION; -- GRANT OPTION allows appOwner to grant this SELECT right to your users or roles. CONNECT appOwner; CREATE VIEW state AS SELECT * FROM otherOwner.state WITH READ ONLY;
或者你可以創建一個同義詞(as
appOwner
):CREATE SYNONYM state FOR otherOwner.state;
在這兩種情況下,您的使用者都不得訪問
otherOwner
.