2012-10-04 72 views
2

我們想讓我們的一些用戶有權從數據庫中讀取他們想要的任何內容,所以我們感興趣 - 是否有任何只支持SELECT,WHERE和JOIN運算符的SQL方言?只讀SQL ..有沒有DSL?

我們想利用這樣的:

class MyModelWithSQLRule(models.Model): 
    sql_rule = models.TextField() 

    def what_data_i_will_get(self): 
     """ 
     Here we must get exception with attempt of query like 
     DELETE * FROM users_users; SELECT id FROM users_users; 
     """ 
     parsed_sql_rule = select_only_parser(self.sql_rule) 
     return Users.objects.raw(parsed_sql_rule) 

這不是數據庫引擎。我想語言,在SQL的子族,但沒有像DELETE危險的話。

+1

在數據庫引擎中使用權限執行它! –

+1

根據你使用的數據庫有很多不同的答案「如何」,所以你使用的是哪個數據庫,並且你使用的是否是OR-M? –

+0

您正在使用哪個SQL數據庫?不同的數據庫支持訪問控制的不同機制。 –

回答

4

根據你所說的關鍵詞,答案是

什麼你可以做的是爲你的數據庫設置2個連接字符串,1在數據庫級設置爲只讀,另一個可以是讀/寫連接字符串,然後你只需要用適當的連接字符串構造一個數據庫會話上下文。這使您在應用程序級別獲得一定程度的安全性,但最終仍然依賴於數據庫,因爲會從中引發錯誤。

+0

其實我現在接受,答案是否定的,沒有面向只讀操作的SQL的子語言。謝謝。 :) –

1

大多數SQL實現將允許您使用權限來控制訪問和權限,通常如GRANTDENYREVOKE

+0

+1,使用內置的訪問控制 –

+0

不,不需要..它需要數據庫管理,或多個連接到數據庫。我只想檢查該查詢是否已過濾。我知道'GRANT' - 這不是爲了這個任務。 :) –

1

如果您不希望數據庫進行授權,我認爲您必須將問題轉移到使用SQL的編程語言。我知道沒有SQL方言可以使用,只會允許非修改查詢。

你怎麼解析你的表達式,看看它是否使用任何禁止的關鍵字,如DELETE,UPDATE,INSERT等。解析(一大部分)SQL在Python中非常可行,我建議你看看代之以。 儘管我仍然認爲只需要一個只讀用戶並通過單獨的連接傳遞所有查詢將會更簡潔,更簡單。

編輯:

也許你可以使用交易,但從來沒有承諾呢?這對你有用嗎?

+0

我曾考慮過在查詢中使用'if'['UPDATE','DELETE','INSERT']和啓動此解決方案之後 - 決定詢問SQL的子語言。 scala的sql dsl數量有限 - https://github.com/p3t0r/scala-sql-dsl - 我想爲Python這樣的東西。 –

+0

如果你打算在查詢中使用簡單的'if'方法,我建議再想一想。設置自己的整個世界的痛苦。在某個時刻忘記惡意用戶,如果有人構建完全合法的'SELECT * FROM Person WHERE Status ='DELETE';'。我認爲你現在面臨着構建你自己的SQL解析器或掛鉤到現有的解析器的挑戰......祝你好運! –

1

最簡單的方法,如果你需要支持的是django - 就是編寫你自己的數據庫適配器來爲你過濾查詢。

這將允許你創建你自己的「sql語言」。

相關問題