Автоматически создавать индексы в другой файловой группе, редактировать сценарий публикации профиля - PullRequest
2 голосов
/ 15 марта 2019

Мне нужен способ автоматического перемещения кластерных индексов в одну файловую группу: ClusteredFilegroup и все некластеризованные индексы в другую файловую группу NonClusteredFilegroup при создании DDL. У нас есть профиль публикации sql, который создает подобный скрипт ниже каждого еженедельного развертывания Как использовать PowerShell для этого?

Я бы хотел, чтобы powershell добавил слова ON [ClusteredFilegroup] после каждого создания таблицы

или ON [NonClusteredFilegroup] для каждого некластеризованного индекса.

Powershell должен уметь читать оригинальный скрипт (testscript.sql) и запускать на нем редактирование текста.

Оригинальный сценарий:

GO
CREATE TABLE [dbo].[Dim_Product] (
    [DimProductId]        INT            IDENTITY (1, 1) NOT NULL,
    [ProductName]         VARCHAR(64)    NOT NULL,
    [ProductDescription]  VARCHAR(64)    NOT NULL,
    [BeginDate]           DATETIME       NOT NULL,
    [EndDate]             DATETIME       NOT NULL,
    CONSTRAINT [PK_DimProductId] PRIMARY KEY CLUSTERED ([DimProductId] ASC)
);

GO
CREATE NONCLUSTERED INDEX [NCX_Product_ProductName]
    ON [dbo].[Dim_Product]([ProductName] ASC);

GO
CREATE NONCLUSTERED INDEX [NCX_Product_BeginDate]
    ON [dbo].[Dim_Product]([BeginDate] ASC);   


GO
CREATE TABLE [dbo].[Dim_Customer] (
    [DimCustomertId]        INT           IDENTITY (1, 1) NOT NULL,
    [CustomerName]         VARCHAR(64)    NOT NULL,
    [CustomerDescription]  VARCHAR(64)    NOT NULL,
    [BeginDate]           DATETIME        NOT NULL,
    [EndDate]             DATETIME        NOT NULL,
    CONSTRAINT [PK_DimCustomerId] PRIMARY KEY CLUSTERED ([DimCustomerId] ASC)
);

GO
CREATE NONCLUSTERED INDEX [NCX_Customer_CustomerName]
    ON [dbo].[Dim_Customer]([CustomerName] ASC);

GO
CREATE NONCLUSTERED INDEX [NCX_Customer_BeginDate]
    ON [dbo].[Dim_Customer]([BeginDate] ASC);

Цель:

CREATE TABLE [dbo].[Dim_Product] (
     [DimProductId]        INT           IDENTITY (1, 1) NOT NULL,
     [ProductName]         VARCHAR(64)   NOT NULL,
     [ProductDescription]  VARCHAR(64)   NOT NULL,
     [BeginDate]           DATETIME      NOT NULL,
     [EndDate]             DATETIME      NOT NULL,
     CONSTRAINT [PK_DimProductId] PRIMARY KEY CLUSTERED ([DimProductId] ASC)
    ) ON [ClusteredFilegroup];

    GO
CREATE NONCLUSTERED INDEX [NCX_Product_ProductName]
     ON [dbo].[Dim_Product]([ProductName] ASC) ON [NonClusteredFilegroup];

Я пытаюсь исследовать следующие сценарии:

Добавление текста к каждой строке в текстовом файле с помощью PowerShell

Поиск в текстовом файле определенного слова, если найдено, скопировать всю строку в новый файл в powershell

https://dba.stackexchange.com/questions/229380/automatically-have-nonclustered-indexes-in-a-different-filegroup/229382#229382

1 Ответ

2 голосов
/ 15 марта 2019

Это должно сработать:

$sql = Get-Content .\org.sql -Raw
$sql = $sql -replace '(?smi)(CREATE TABLE (.*?))\);','$1 ) ON [ClusteredFilegroup];'
$sql = $sql -replace '(?smi)(CREATE NONCLUSTERED INDEX (.*?))\);','$1) ON [NonClusteredFilegroup];'
$sql | Set-Content -Path .\new.sql

(?smi) указывает оператору замены соответствовать нескольким строкам (m), включать новые строки и игнорировать регистр (i). (.*?) включает в себя все, включая переводы строки (отсюда (?smi)), но не жадные (?).

...