2017-12-17 15 views
1

ユーザーがテーブルにデータを挿入するときにファイルグループを動的に作成したいが、SQL Serverは例外をスローします。トリガー内でALTER DATABASEステートメントを使用できません

私はSQL Serverエージェントでこれを処理できることを知っていますが、私のアプローチが正しくない場合は正しい方法を教えてください。

大切にしてください。

ALTER TRIGGER [AuditTrigger] 
ON [Audit] 
INSTEAD OF INSERT 
AS 
BEGIN 
    DECLARE @DateInserted DATETIME = (SELECT DateInserted FROM inserted); 
    DECLARE @NextRange DATETIME; 

    DECLARE @currentFileGroup NVARCHAR(MAX)= ('APP_PT_' + CAST(YEAR(@DateInserted) AS NVARCHAR(4)) +'_'+ CAST(MONTH(@DateInserted) AS NVARCHAR(2))) 
    --print @currentFileGroup; 

    DECLARE @fileExsits BIT = (SELECT (CASE WHEN EXISTS(SELECT NULL AS [EMPTY] FROM SYS.FILEGROUPS WHERE name LIKE @currentFileGroup) THEN 1 ELSE 0 END)) 

    IF @fileExsits = 0 
    BEGIN 
     SET @NextRange = (SELECT Replace(CONVERT(VARCHAR(10), @DateInserted, 111),'/','-')) 

     DECLARE @filefullname VARCHAR(MAX) = (SELECT physical_name FROM SYS.DATABASE_FILES WHERE name = 'DB_Test') 
     DECLARE @fgFullName VARCHAR(MAX) = (SELECT (LEFT(@filefullname, LEN(@filefullname) - CHARINDEX('\', REVERSE(@filefullname))) + '.ndf')) 

     -- The exception occurs here -- 
     ALTER DATABASE DB_TEST 
     ADD FILE (NAME = [@currentFileGroup], 
        FILENAME = [@fgFullName], 
        SIZE = 5MB, 
        MAXSIZE = 100MB, 
        FILEGROWTH = 1MB) 
     TO FILEGROUP Audit_2017 

     ALTER PARTITION FUNCTION [PF]() 
     SPLIT RANGE (@NextRange); 

     ALTER PARTITION SCHEME [PS] 
     NEXT USED [@currentFileGroup]; 
    END 

    INSERT INTO LogTable VALUES (@currentFileGroup) 

    INSERT INTO [Audit] 
     SELECT DateInserted, Title 
     FROM inserted; 
END 

結果:

メッセージ287、レベル16、状態2、手順AuditTrigger、ライン24
ALTER DATABASEステートメントがトリガー内で許可されていません。

+1

トリガーは非常に迅速かつ迅速に** **すべきではありません**広範な計算や処理を行うべきではありません**。データベースを変更して新しいファイルを追加することは、あまりにも広範な** **トリガーの中で処理する操作です!たとえできても、これをしないでください!あなたの戦略をここで再考する必要があります - これは間違いなく道のりではありません –

答えて

2

Auditテーブルの挿入にストアドプロシージャを使用し、そこにファイルグループ/ファイル/パーティションのメンテナンスコードを含めることができます。このトリガーは、副照会のために複数行の挿入が失敗することに注意してください。

つまり、私はパーティションのメンテナンスのために予定された毎日の仕事のアプローチがよりクリーンだと思います。なぜ各パーティションに新しいファイルとファイルグループを作成するのが難しいのか分かりません。特殊なユースケースがない限り、各パーティションを同じファイルグループに配置するだけです。パーティション機能がSPLITの間に過剰なデータ移動とログを避けるためにRANGE RIGHTであることを確認してください。

関連する問題