1

我有这些 SQL DB 创建脚本,我想从中提取表名以创建 GRANT 访问。

提取实际名称不是问题:

^创建表 ([\w\.]+)[\r\n]+

但是,如果我只想Regex.Replace从这些名称中创建 GRANT 语句(在第 1 组中),我会遇到所有与我想摆脱的不匹配的行

例如

为了:

CREATE TABLE dbo.t_MyType
(
    ID INTEGER PRIMARY KEY IDENTITY,
    TypeName VARCHAR(16) NOT NULL
)
CREATE UNIQUE INDEX IndexMyType ON dbo.t_MyType (TypeName)

CREATE TABLE dbo.t_MyType2
(
    ID INTEGER PRIMARY KEY IDENTITY,
    TypeName VARCHAR(16) NOT NULL
)
CREATE UNIQUE INDEX IndexMyType ON dbo.t_MyType2 (TypeName)

我得到:

GRANT SELECT ON dbo.t_MyType TO db_read(
    ID INTEGER PRIMARY KEY IDENTITY,
    TypeName VARCHAR(16) NOT NULL
)
CREATE UNIQUE INDEX IndexMyType ON dbo.t_MyType (TypeName)

GRANT SELECT ON dbo.t_MyType2 TO db_read(
    ID INTEGER PRIMARY KEY IDENTITY,
    TypeName VARCHAR(16) NOT NULL
)
CREATE UNIQUE INDEX IndexMyType ON dbo.t_MyType2 (TypeName)

所以问题是:为了得到以下结果,我需要使用什么正则表达式和替换字符串对?

GRANT SELECT ON dbo.t_MyType TO db_read
GRANT SELECT ON dbo.t_MyType2 TO db_read
4

1 回答 1

1

不做替换,只通过Regex.Matches返回的MatchCollection枚举并构建一个新的 sql 文件。(您需要稍微修改一下您的正则表达式)

static void Main(string[] args)
{
    string query = 
@"CREATE TABLE dbo.t_MyType
(
    ID INTEGER PRIMARY KEY IDENTITY,
    TypeName VARCHAR(16) NOT NULL
)
CREATE UNIQUE INDEX IndexMyType ON dbo.t_MyType (TypeName)

CREATE TABLE dbo.t_MyType2
(
    ID INTEGER PRIMARY KEY IDENTITY,
    TypeName VARCHAR(16) NOT NULL
)
CREATE UNIQUE INDEX IndexMyType ON dbo.t_MyType2 (TypeName)";

    string matchString = @"CREATE TABLE ([\w\.]+)";


    var matches = Regex.Matches(query, matchString);

    StringBuilder sb = new StringBuilder();

    foreach (Match match in matches)
    {
        sb.AppendFormat("GRANT SELECT ON {0} TO db_read", match.Groups[1]).AppendLine();
    }

    Console.WriteLine(sb.ToString());

    Console.ReadLine();

}
于 2013-04-29T20:29:57.790 回答