【问题标题】:Regular expression to detect hidden DML(insert, update, delete) statements in a DDL(create, alter, drop) .sql script用于检测 DDL(创建、更改、删​​除).sql 脚本中隐藏的 DML(插入、更新、删除)语句的正则表达式
【发布时间】:2013-02-19 21:12:35
【问题描述】:

更新:为了让这个问题更容易。我已经改变了字符串和 现在您根本不必担心 BEGIN END。相反,我现在只有 GO 语句 终结者。我希望我现在能从其他人那里得到一些答案

我需要编写一个正则表达式来检测隐藏的 DML 语句,如 DDL 脚本(CREATE、ALTER、DROP)中的 INSERT、UPDATE、DELETE。

示例。在下面的脚本中,它应该捕获 2 个 delete table5 语句和最后一个 insert into table3 语句。但它应该忽略实际上在存储过程本身的主体中的插入语句。

如果你在这里运行这个 RegEx:http://regexr.com?33rf3,你会看到我已经完成了 90%。唯一不起作用的部分是它正在进行贪婪匹配,直到最后一个 GO。我需要它在第一次 GO 时停止。我试过使用 +?运算符使其不贪婪,但它不想工作。

delete table5 /*Regex should find this*/

GO

create proc abc
begin
    insert into table1  /*Regex should IGNORE this*/
    begin
        fake nesting here
        insert into table2 /*Regex should IGNORE this*/
    end
end

GO

delete table5 /*Regex should find this*/

GO

alter proc abc2
begin
  --no statements in this proc
end

GO

insert into table3 /*Regex should find this*/

【问题讨论】:

  • 由于嵌套括号(开始/结束),在这种情况下只能使用 .NET 正则表达式实现。另一种选择是假设它将是开始/结束的有限嵌套
  • 幸运的是我使用的是 C#。任何想法正则表达式会是什么样子?您还可以假设它是否简单,没有开始结束......并且所有语句都以 GO 结束
  • 我认为你找错树了。如果你让它与正则表达式一起使用,我会感到惊讶。 stackoverflow.com/questions/133601/…
  • 如果您不信任您的脚本,那么您不应该运行它们,或者您应该从不会造成任何损害的帐户运行它们。
  • @John Saunders - 在不知道我这样做的背景的情况下,您添加该评论是不公平的。这样做有一个非常充分的理由,我在这里无法解释。 stackexchange 是为了提出技术问题,而不是提供背后的商业原因。而且我认为我在问题中提供了足够的信息,以便人们能够回答。

标签: c# .net regex sql-parser tsql-parser


【解决方案1】:

不需要 GO 语句。

        var regex1 = new Regex(@"
          (?s)
          (create|alter|drop).+?
          begin
            (?:
               (?> (?! begin | end ) .
                  | begin (?<counter>)
                  | end  (?<-counter>)
                )*
            )
            (?(counter)(?!))
          end
          "
        , RegexOptions.IgnorePatternWhitespace
        );

        var regex2 = new Regex(@"(?:insert|update|delete).+");

        var result = regex2.Matches(regex1.Replace(your_input, ""))
            .Cast<Match>()
            .Select(m => m.Value);

此代码删除所有创建/更改/删除语句,然后查找删除/更改/删除。我认为它可以只使用一个正则表达式来完成,但我现在只能建议,抱歉:)

【讨论】:

  • 谢谢泰迪。明天上班时,我一定会更新您并尝试一下。这对我来说已经足够了。我现在并不是真的在寻找最佳解决方案。一个有效的解决方案对我来说是正确的:)
猜你喜欢
  • 2013-08-01
  • 2010-12-28
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 2016-01-02
相关资源
最近更新 更多