我有一个关于识别SQL查询类型的查询,通过它我想弄清楚是否有任何DDL语句正在执行。
是否有任何c# API可用来识别SQL查询类型是DDL还是DML?在c#中,这是不可能的,除非使用devio提出的解析方法。
只允许DML语句被执行,你应该使用内部数据库安全机制。例如,将所有DDL移动到存储过程中,并将"grant exec"授予admin。
您的问题是指代码分析还是执行分析?
在代码中,查找CREATE, ALTER和DROP语句(取决于您的数据访问层)
对于执行分析,您可以创建DDL触发器。
UPDATE注释后
看了你的评论后,我认为最好的解决方案是使用SQL Server的权限系统来限制交互用户的能力。
创建数据库或应用程序角色,为该角色分配用户,并选择用户/角色所需的授予。在这个新用户的上下文中运行交互式SQL语句。
这样可以设置每个表/视图/sp等的权限。和每个命令(SELECT/INSERT等),而不需要解析SQL语句
运行这段代码,在它的最后,您将得到所有DDL匹配的摘要。每次都很完美!!
string matchedSQL;
//Parse DDL statements
Regex DDL = new Regex(@"(?<=b(create|alter|drop)s+(procedure|proc|table|trigger|view|function)bs[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();
}