在 DDL 触发器中更改数据库语句

Alter Database Statement in DDL Trigger

我正在尝试通过创建时触发的 DDL 触发器来更改数据库。但是我收到以下错误。

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.

如果您想要为每个创建的新数据库设置特定的兼容级别 - 只需在 model 数据库中设置该兼容级别,即 "template" 所有正在创建的新数据库...

不需要系统级触发器....

我意识到 DDL 触发器将在它自己的事务上,如果事务已经启动,则不允许更改。因此,为了解决这个问题,我创建了 SQL 作业。并将 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'