1

テーブル名を抽出して GRANT アクセスを作成するこれらの SQL DB 作成スクリプトがあります。

実際の名前を抽出することは問題ではありません:

^CREATE TABLE ([\w\.]+)[\r\n]+

ただし、Regex.Replaceこれらの名前 (グループ 1) から GRANT ステートメントを作成するだけの場合は、削除したい一致しないすべての行で立ち往生しています

例えば

為に:

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 に答える