我有一个关于识别SQL查询类型的查询,如果有任何DDL语句被执行,我想通过它查询。
是否有任何C#API可用于识别SQL查询类型是DDL还是DML?
答案 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();
}