사용자가 테이블에 데이터를 삽입하려고 할 때 동적으로 파일 그룹을 만들려고하지만 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)
.
방아쇠는 ** 매우 민첩하고 빠릅니다 ** - 광범위한 계산이나 처리를해서는 안됩니다 **. 데이터베이스를 변경하고 새 파일을 추가하는 것은 너무 방대합니다 ** 트리거 내에서 처리하는 작업입니다! 가능한 경우에도 이렇게하지 마십시오! 여기서 전략을 다시 생각해 볼 필요가 있습니다. 이것은 분명히 갈 길이 아닙니다. –