SQL Query-DDL或DML

时间:2011-11-18 07:06:39

标签: c# sql-server

我有一个关于识别SQL查询类型的查询,如果有任何DDL语句被执行,我想通过它查询。

是否有任何C#API可用于识别SQL查询类型是DDL还是DML?

3 个答案:

答案 0 :(得分:1)

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

要仅允许执行DML语句,您应该使用内部数据库安全机制。例如,将所有DDL移动到存储过程并将“grant exec”移动到admin。或者仅将“db_ddladmin”角色授予管理员。

答案 1 :(得分:0)

您的问题是指代码分析还是执行分析?

在代码中,搜索CREATE,ALTER和DROP语句(取决于您的数据访问层)。

对于执行分析,您可以创建DDL Triggers

评论后

更新

在阅读您的评论后,我认为最好的解决方案是使用SQL Server的权限系统来限制交互式用户的功能。

创建数据库或应用程序角色,将用户分配给该角色,然后选择用户/角色所需的GRANT。在此新用户的上下文中运行交互式SQL语句。

这样您就可以为每个表/ view / sp / etc设置权限。和每个命令(SELECT / INSERT等),无需解析SQL语句。

答案 2 :(得分:-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();
    }