Sql DDL触发器中的Alter Database语句
我试图通过DDL触发器来更改数据库,该触发器将在创建时触发。然而,我得到了下面的错误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(
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:但如果您有一个系统范围的触发器,这些设置将应用于所有新数据库。。。。。。