2015-04-18 3 views
1

Я пытаюсь изменить базу данных через триггер DDL, который будет срабатывать при создании. Однако я получаю ошибку ниже.Alter Database Statement в DDL Trigger

CREATE TRIGGER ddl_trig_database 
ON ALL SERVER 
FOR CREATE_DATABASE 
AS 
    declare @dbname as nvarchar(100) 
    declare @sql as nvarchar(max) 

    select @dbname = 
     CAST(eventdata().query(
     '/EVENT_INSTANCE/DatabaseName[1]/text()' 
     ) as NVarchar(128)) 
    select @sql = N'SET IMPLICIT_TRANSACTIONS OFF 
    ALTER DATABASE ' + @dbname+ N' SET COMPATIBILITY_LEVEL = 110 
    SET IMPLICIT_TRANSACTIONS ON' 
    exec (@sql) 
GO 
create database test 

Ошибка:

Msg 226, Level 16, State 6, Line 22
ALTER DATABASE statement not allowed within multi-statement transaction. The statement has been terminated.

Я на SQL Server 2014 на Windows, 2012.

ответ

1

Я понял, что триггер DDL будет находиться на собственной транзакции, а Alter не разрешен, если транзакция уже запущена. Поэтому для решения этой проблемы я создал SQL Job. и поместите Alters в Job и измените Trigger на вызов msdb..start_sql_job.

--Trigger 
CREATE TRIGGER ddl_trig_database 
ON ALL SERVER 
FOR CREATE_DATABASE 
AS 
    exec msdb..sp_start_job 'Initialize Database' 
GO 

--Job 
declare @dbname as nvarchar(100) 
declare @sql as nvarchar(max) 
select top 1 @dbname = name from sys.databases 
    where name like 'gtp%' and create_date >= getdate() - .08 
    order by create_date desc 
IF @dbname is not null 
begin 
    select @sql = N'ALTER DATABASE ' + @dbname+ N' SET COMPATIBILITY_LEVEL = 110' 
    exec sp_executesql @sql 
    print 'Altered database' 
end 
print 'completed' 
1

Если вы хотите определенный уровень совместимости для каждой новой базы данных, созданной - просто установить, что уровень совместимости в model база данных, которая является «шаблоном» для всех создаваемых баз данных ...

Нет необходимости в триггерах уровня системы для этого ....

+0

Я хочу установить условие для определенных баз данных и не хочу, чтобы оно было на всех. –

+0

@ShijuSamuel: но если у вас есть системный триггер - эти настройки будут применены к ** всем ** новым базам данных ...... –

Смежные вопросы