Sql-Server
創建表/索引時如何強制使用者指定文件組
我將很快遷移到 SQL Server 2017,因此正在努力美化我們數據庫中一些被忽視的方面。一方面是文件組:我的 DBA 前任創建了多個文件組,但是因為沒有人真正被告知大多數對像只是轉到預設文件組 (PRIMARY)。
現在我想強制創建表和索引的人實際上命名他們的對象應該駐留的文件組。含義:沒有“ON”的 CREATE TABLE 或 CREATE INDEX
$$ Filegroup $$" 應該回滾並顯示文件組失去的錯誤。有什麼方法可以做到這一點,您是否建議繼續使用這種方法?我剛剛遇到基於策略的管理無法阻止在預設情況下創建對象文件組。 這樣做的要點是 someboy 應該首先為對象選擇文件組,而不是在預設文件組中創建它們,然後必鬚根據 DBA 的咆哮來移動對象 :-)。
我想到了兩種技術……但是由於缺少知識,無法開始使用其中任何一種:
- 使用數據庫觸發器檢查是否有 on 子句,如果沒有回滾 –> 這似乎很脆弱,因為它取決於命令文本的文本分析
- 使主文件組的大小非常小(100KB?),以便系統表仍然能夠容納,但其他中等大小的表會導致錯誤,因為沒有足夠的空間 -> 這可能是個壞主意可能會對數據庫可用性產生嚴重的副作用,並且在防止在預設文件組中創建每個使用者定義的表或索引方面不夠精確
非常感謝您的幫助
馬丁
您可以使用 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.