2011-11-18 58 views
1

我有一個關於識別SQL查詢類型的查詢,如果有任何DDL語句正在執行,我想通過這些查詢類型進行查詢。SQL Query-DDL或DML

是否有任何C#API可用來識別SQL查詢類型是DDL還是DML?

+0

否 - 鍵盤上的人形生物需要根據查詢中的內容來決定... –

+1

您是否問C#SQL解析器是否存在? –

+0

請參閱:http://stackoverflow.com/questions/589096/parsing-sql-code-in-c-sharp –

回答

0

您的問題涉及代碼分析或執行分析嗎?

在代碼中,搜索CREATE,ALTER和DROP語句(取決於您的數據訪問層)。

對於執行分析,您可以創建DDL Triggers

UPDATE評論

閱讀您的評論後後,我認爲最好的辦法是使用SQL Server的許可制度限制用戶交互的能力。

創建數據庫或應用程序角色,將用戶分配給該角色,然後選擇用戶/角色所需的GRANT。在這個新用戶的上下文中運行交互式SQL語句。

這樣你可以設置每個表/視圖/ sp/etc的權限。和每個命令(SELECT/INSERT等),而不需要解析SQL語句。

+0

這是像我應該只允許執行DML語句,以防止可能注入我的數據庫的有害查詢。使用搜索關鍵字會很麻煩。 – Neena

1

在C#中,除了devio提出的解析方式之外,這是不可能的。

爲了只允許執行DML語句,您應該使用內部數據庫安全機制。例如,將所有DDL移動到存儲過程並將「grant exec」移動到admin。或者將「db_ddladmin」角色授予管理員。

+0

這是供最終用戶使用,可以在其中編寫sql查詢並在UI中獲取結果。我需要阻止包含'drop'或'exec'等的查詢。如果我需要通過解析來阻止所有這些,它將會是一個巨大的列表。因此我正在尋找另一種選擇。 – Neena

+0

然後我建議尋找SQL解析器 - 例如在Code Project中有一個 – mikalai

-1

運行此代碼,並在其結尾處,您將有一個所有DDL匹配的摘要。每一次都完美無瑕!

string matchedSQL; 

    //Parse DDL statements 
    Regex DDL = new Regex(@"(?<=\b(create|alter|drop)\s+(procedure|proc|table|trigger|view|function)\b\s\[dbo\].)\[.*?\]", RegexOptions.IgnoreCase); 
    Match match = DDL.Match(script); 
    while (match.Success) 
    { 
     matchedSQL += match.Groups[1].Value + " " + match.Groups[2].Value + " " + match.Value; 
     match = match.NextMatch(); 
    }