私はまもなくSQL Server 2017に移行するので、データベースのいくつかの無視されている側面を美化することに取り組んでいます。 1つの側面はファイルグループです。私のDBAの前任者は複数のファイルグループを作成しましたが、ほとんどのオブジェクトについて誰も実際には知らされていないため、デフォルトのファイルグループ(PRIMARY)に移動します。
次に、テーブルとインデックスを作成するユーザーが、オブジェクトが存在する必要があるファイルグループに実際に名前を付けることを強制します。意味:「ON [ファイルグループ]」のないCREATE TABLEまたはCREATE INDEXは、ファイルグループが見つからないというエラーでロールバックする必要があります。これを行う方法はありますか?そのようなアプローチを進めることをお勧めしますか?私は、ポリシーベースの管理が 機能しない がデフォルトのファイルグループにオブジェクトが作成されないようにすることを見つけました。
これを行う主なポイントは、誰かがデフォルトのファイルグループでオブジェクトを作成するのではなく、最初にオブジェクトのファイルグループを選択し、その後DBAによる怒りに基づいてオブジェクトを移動する必要があるということです:-)。
私は2つのテクニックについて考えました...しかし、知識が欠落しているため、どちらの方法でも始めることができません:
よろしくお願いします
マーティン
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.