트리거가 적용된 메모리 최적화 테이블에서 alter table 실패

·         Version : SQL Server 2014, 2016

 

SQL Server 메모리 최적화 테이블에 트리거가 적용되어 있는경우 alter table 작업이 아래 오류와 함께 실패한다.

Msg 41317, Level 16, State 3, Procedure ddl_trigger, Line 5 [Batch Start Line 28]

A user transaction that accesses memory optimized tables or natively compiled modules cannot access more than one user database or databases model and msdb, and it cannot write to master.

 

기본적으로 메모리 최적화 테이블이나 컴파일된 모듈에 액세스 하는 사용자 트랜잭션은  이상의 사용자 데이터베이스  시스템 데이터베이스에 액세스   없으며   없다. Alter 문은 다른 데이터베이스를 포함하지 않는다.

 

아래 코드는 메모리 최적화 테이블에서 DDL 트리거를 적용한  alter table 작업시 오류가 발생하는 내용을 확인할  있다.

 

트리거된 데이터를 저장하기 위해 msdb 테이블을 생성한다. (사용자 DB 라도 상관 없음)

use msdb

go

 

create table tblTrack (DBname nvarchaR(50), Event_Data nvarchar(max))

go

 

테스트용 데이터베이스를 생성한다.

CREATE DATABASE imoltp

CONTAINMENT = NONE

ON  PRIMARY

( NAME = N'imoltp', FILENAME = N'C:\_SQL_Data\imoltp.mdf' ),

FILEGROUP [InMemory] CONTAINS MEMORY_OPTIMIZED_DATA  DEFAULT

( NAME = N'imoltpfg', FILENAME = N'C:\_SQL_Data\imoltpfg' , MAXSIZE = UNLIMITED)

LOG ON

( NAME = N'imoltp_log', FILENAME = N'C:\_SQL_Data\imoltp_log.ldf' , SIZE = 25600KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)

GO

 

 

 

DDL 트리거를 생성하고 테이블을 생성한다.

use imoltp

go

 

CREATE TRIGGER ddl_trigger ON DATABASE   

FOR ALTER_TABLE AS

set nocount on   

begin

       insert into msdb.dbo.tblTrack values(DB_NAME(),EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','varchar(max)') ) 

end  

go

 

CREATE TABLE [dbo].t

(

[id] [bigint] IDENTITY(1,1) NOT NULL,

       CONSTRAINT [pk_id]  PRIMARY KEY NONCLUSTERED HASH ([id])WITH ( BUCKET_COUNT = 16777216)

)WITH ( MEMORY_OPTIMIZED = ON , DURABILITY = SCHEMA_AND_DATA )

go

 

DDL트리거가 적용된 상태에서 메모리 최적화 테이블에 alter table 작업을 실행 한다오류가 발생하는 것을 확인할  있다.

alter table t add c2 int not null DEFAULT 1 WITH VALUES

go

 


 

메모리 최적화 테이블에서 alter table 사용하려면 트리거를 제거  작업을 진행그리고 다시 트리거를 생성하여 사용할  있다.

 

[참고자료]

https://blogs.msdn.microsoft.com/psssql/2017/05/10/unable-to-issue-alter-table-for-a-memory-optimized-tables/

 



강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp
No. Subject Author Date Views
Notice SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 45304
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 24213
2094 SQL Linux에서 기본 백업 디렉토리 변경 jevida(강성욱) 2017.09.13 3965
2093 Linux에서 DISK I/O 사용량 확인 jevida(강성욱) 2017.09.13 3928
2092 Linux에서 CPU 사용량 확인 jevida(강성욱) 2017.09.13 2319
2091 SQL Linux에서 SQL Server 시작, 중지, 활성, 비활성 jevida(강성욱) 2017.09.13 1543
2090 SQL Server DBA 체크리스트 jevida(강성욱) 2017.05.31 8330
2089 SQL Server 데이터베이스 백업이 성공적인지 확인하는 방법 jevida(강성욱) 2017.05.31 3820
» 트리거가 적용된 메모리 최적화 테이블에서 alter table 실패 jevida(강성욱) 2017.05.31 3396
2087 메모리 최적화 테이블 변수 및 예상 행수 jevida(강성욱) 2017.05.31 3044
2086 백업 파일 복원과 3241 오류 (Microsoft® SQL Server® Backup to Microsoft Azure®Tool 사용) jevida(강성욱) 2017.05.31 3266
2085 In-Memory OLTP를 사용할 때 체크포인트 파일이 너무 많아 지는 이유 jevida(강성욱) 2017.05.31 2751
2084 메모리 최적화 테이블변수와 701 오류 (loop 사용으로 인한 메모리 부족 오류) jevida(강성욱) 2017.05.31 3471
2083 메모리 최적화 테이블에서 해시 인덱스 사용시 버킷 카운트의 중요성 jevida(강성욱) 2017.05.31 3114
2082 인덱스 리빌드시 병렬로 실행계획이 생성되지 않는 이유 jevida(강성욱) 2017.03.13 5089
2081 SQL Server 833오류 (15 Sec Slow IO Detected) jevida(강성욱) 2017.03.13 4531
2080 SQL Server nonpreemptive 모드에서Long Sync IO 오류 jevida(강성욱) 2017.03.13 3361
2079 SQL Server DTC Transaction의 SPID = -2 반환 jevida(강성욱) 2017.03.13 2478
2078 SQL Server Read/Writer 동기화 작동 원리 jevida(강성욱) 2017.03.13 2824
2077 SQL Server가 논리 및 물리 프로세서를 결정하는 방법 jevida(강성욱) 2017.03.13 2958
2076 데이터베이스에서 사용자 삭제 오류 jevida(강성욱) 2017.03.13 2948
2075 SQL Server ODBC Driver 및 Command package Tool 설치 jevida(강성욱) 2017.01.11 4865





XE Login