2017-12-17 18 views
1

사용자가 테이블에 데이터를 삽입하려고 할 때 동적으로 파일 그룹을 만들려고하지만 SQL Server에서 예외가 발생합니다.트리거 내에서 ALTER DATABASE 문을 사용할 수 없습니다.

SQL Server Agent에서이 문제를 처리 할 수 ​​있다는 것을 알고 있지만 내 접근 방식이 올바르지 않으면 올바른 방법을 말해주십시오.

친절하게 제공합니다.

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 

결과 : ALTER DATABASE 문은 트리거 내에서 허용되지

메시지 287, 수준 16, 상태 2, 프로 시저 AuditTrigger, 선 (24)
.

+1

방아쇠는 ** 매우 민첩하고 빠릅니다 ** - 광범위한 계산이나 처리를해서는 안됩니다 **. 데이터베이스를 변경하고 새 파일을 추가하는 것은 너무 방대합니다 ** 트리거 내에서 처리하는 작업입니다! 가능한 경우에도 이렇게하지 마십시오! 여기서 전략을 다시 생각해 볼 필요가 있습니다. 이것은 분명히 갈 길이 아닙니다. –

답변

2

감사 대신 트리거 테이블에 대한 저장 프로 시저를 사용하고 파일 그룹/파일/파티션 유지 관리 코드를 포함시킬 수 있습니다. 이 트리거는 부속 조회로 인해 다중 행 삽입에서 실패합니다.

즉, 나는 파티션 관리를위한 계획된 일일 접근법이 더 깨끗하다고 ​​생각한다. 왜 각 파티션에 대해 새 파일과 파일 그룹을 만들지 않는지 잘 모릅니다. 특별한 사용 사례가 없다면 각 파티션을 동일한 파일 그룹에 배치하기 만하면됩니다. SPLIT 동안 과도한 데이터 이동 및 로깅을 방지하려면 파티션 기능이 RANGE RIGHT인지 확인하십시오.