web-dev-qa-db-ja.com

テーブル/インデックスを作成するときにユーザーにファイルグループを指定させる方法

私はまもなくSQL Server 2017に移行するので、データベースのいくつかの無視されている側面を美化することに取り組んでいます。 1つの側面はファイルグループです。私のDBAの前任者は複数のファイルグループを作成しましたが、ほとんどのオブジェクトについて誰も実際には知らされていないため、デフォルトのファイルグループ(PRIMARY)に移動します。

次に、テーブルとインデックスを作成するユーザーが、オブジェクトが存在する必要があるファイルグループに実際に名前を付けることを強制します。意味:「ON [ファイルグループ]」のないCREATE TABLEまたはCREATE INDEXは、ファイルグループが見つからないというエラーでロールバックする必要があります。これを行う方法はありますか?そのようなアプローチを進めることをお勧めしますか?私は、ポリシーベースの管理が 機能しない がデフォルトのファイルグループにオブジェクトが作成されないようにすることを見つけました。

これを行う主なポイントは、誰かがデフォルトのファイルグループでオブジェクトを作成するのではなく、最初にオブジェクトのファイルグループを選択し、その後DBAによる怒りに基づいてオブジェクトを移動する必要があるということです:-)。

私は2つのテクニックについて考えました...しかし、知識が欠落しているため、どちらの方法でも始めることができません:

  • データベーストリガーを使用してon句があるかどうかを確認し、ロールバックされていない場合->コマンドテキストのテキスト分析に依存するため、これは非常に壊れやすいようです
  • システムテーブルが収まるようにプライマリファイルグループのサイズを本当に小さく(100KB?)しますが、中程度のサイズの他のテーブルでは、十分なスペースが残っていないためエラーが発生します->おそらくこれは悪い考えですデータベースの可用性に深刻な副作用をもたらす可能性があり、すべてのユーザー定義のテーブルまたはインデックスがデフォルトのファイルグループ内に作成されるのを防ぐには十分正確ではありません

よろしくお願いします

マーティン

3
Martin Guth

Read_Onlyプロパティを設定して、新しい既定のファイルグループを作成することもできます。

データベースファイルを追加:

USE [StackExchange]
GO
ALTER DATABASE [StackExchange] ADD FILE ( NAME = N'StackExchange_DefRO', FILENAME = N'C:\SQL\SQL_DATA\StackExchangeRO.ndf' , SIZE = 5120KB , FILEGROWTH = 1024KB ) TO FILEGROUP [DEFAULTRO]
GO

新しいファイルグループをREADONLYに変更します。

USE [master]
GO
declare @readonly bit
SELECT @readonly=convert(bit, (status & 0x08)) FROM sysfilegroups WHERE groupname=N'DEFAULTRO'
if(@readonly=0)
    ALTER DATABASE [StackExchange] MODIFY FILEGROUP [DEFAULTRO] READONLY
GO

新しいファイルグループをDEFAULTに変更します。

GO
USE [StackExchange]
GO
IF NOT EXISTS (SELECT name FROM sys.filegroups WHERE is_default=1 AND name = N'DEFAULTRO') ALTER DATABASE [StackExchange] MODIFY FILEGROUP [DEFAULTRO] DEFAULT
GO

ユーザーがファイルグループを指定せずにオブジェクトを作成した場合:

USE [StackExchange]
GO

/****** Object:  Table [dbo].[NewTable]    Script Date: 21.12.2017 14:12:11 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[NewTable](
    [ID] [int] NULL,
    [Test] [nchar](10) NULL
)

GO

彼らはエラーメッセージを受け取ります:

Msg 1924, Level 16, State 2, Line 11
Filegroup 'DEFAULTRO' is read-only.
7