2011-11-18 59 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(); 
    }