2015-10-06 59 views
0

我們有一個爲衆多客戶保存數據的數據庫。我們想讓客戶訪問數據庫,但只能訪問屬於他們的數據。解析select然後在where子句中插入「and Company.Name ='Acme'」讓我覺得很脆弱,因爲SQL選擇可能非常複雜,並且處理所有情況下的100%可能很困難。如何爲所有SQL選擇中的一列設置限制?

是否有某種方式做的當量(我知道這是不是有效的SQL):

SELECT * FROM *其中Company.Name ='Acme的和(passed_in_select)

可以嵌套一個完整的選擇作爲一個大選擇的內部部分。有沒有辦法做到上述?這樣對選擇就是一個非常簡單的限制,而且可能在100%的時間內工作。

+1

您真的想要客戶訪問您的數據庫服務器,還是希望他們通過網站或應用程序訪問數據? – zedfoxus

+0

什麼數據庫系統? –

+0

@zedfoxus它將始終通過我們的報告系統,因此可以通過一個可以在傳入時更改選擇的應用程序。 –

回答

2

下面是Oracle數據庫稱爲「虛擬私有數據庫」的系統解決方案:
https://docs.oracle.com/cd/B28359_01/network.111/b28531/vpd.htm

對於其他數據庫看是否有類似的內置解決方案。

但存在使用WITH子句非常簡單的解決辦法:

WITH 
    tab_a__ AS (SELECT * FROM tab_a WHERE comp="xy"), 
    tab_b__ AS (SELECT * FROM tab_b WHERE comp="xy") 
SELECT ... //original select 

你只需要找到在選擇所有使用的表,添加__背後,並添加熱膨脹係數的WITH子句。
注:有些數據庫雖然是SQL標準,但不支持WITH子句。有些數據庫可能會有別名長度限制,您可以通過添加後綴來超出限制。

+0

對於Oracle來說,這看起來很完美。對於其他人,我們必須自己做同樣的事情。謝謝 –

1
select * from 
(
    select * from table_a 
) outer_table_a 
where outer_table_a.col_a = 'test' 

我做這樣的事情經常尤其是當我想在內部查詢(總和,最大值等),我這樣做與SQL Server對數據執行一些聚集,我不知道這是否對其他DBMS有效,但如果不是,我會感到驚訝。

我不知道我是否會依靠這種方法來有效授予權限。也許觀點會讓你把事情壓得更緊。這聽起來像是你計劃動態地將某些東西加入到你可能沒有寫過的查詢中?在任何人寫道,查詢可以改變你的興趣,這將導致能見度很低的東西列你不打算,這樣的情況:

select * from 
(
    select 'test' as col_a, launch_codes from table_a 
) outer_table_a 
where outer_table_a.col_a = 'test' 
+0

我不能使用「where real_table_name.col_a ='test'」來避免列出的重命名問題嗎? –

相關問題