Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql DDL触发器中的Alter Database语句_Sql_Sql Server_Sql Server 2014 - Fatal编程技术网

Sql DDL触发器中的Alter Database语句

Sql DDL触发器中的Alter Database语句,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,我试图通过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(

我试图通过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,第16级,第6状态,第22行
多语句事务中不允许使用ALTER DATABASE语句。 声明已终止


我使用的是Windows 2012上的SQL Server 2014。

如果您希望为创建的每个新数据库设置特定的兼容级别,只需在
模型
数据库中设置该兼容级别,该数据库是所有正在创建的新数据库的“模板”


不需要系统级触发器,我意识到DDL触发器将在它自己的事务上,如果事务已经启动,则不允许Alter。为了解决这个问题,我创建了SQL作业。并在作业中进行修改,修改触发器以调用msdb..start\u sql\u作业

--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'

我想对某些数据库设置一个条件,但不希望所有数据库都设置该条件。@ShijuSamuel:但如果您有一个系统范围的触发器,这些设置将应用于所有新数据库。。。。。。