在 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'
我正在尝试通过创建时触发的 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'