Tsql 如何为SQLServer2005实例中的所有数据库创建DDL触发器
我将为SQLServer实例中的所有数据库创建一个DDL触发器。我希望一次运行,而不是对每个数据库多次运行 下面是我需要执行的两条T-SQL语句:Tsql 如何为SQLServer2005实例中的所有数据库创建DDL触发器,tsql,ddl-trigger,Tsql,Ddl Trigger,我将为SQLServer实例中的所有数据库创建一个DDL触发器。我希望一次运行,而不是对每个数据库多次运行 下面是我需要执行的两条T-SQL语句: -- Create table use <dbname> GO CREATE TABLE dbo.ChangeAttempt (EventData xml NOT NULL, AttemptDate datetime NOT NULL DEFAULT GETDATE(), DBUser char(50) NOT NULL) GO --
-- Create table
use <dbname>
GO
CREATE TABLE dbo.ChangeAttempt
(EventData xml NOT NULL,
AttemptDate datetime NOT NULL DEFAULT GETDATE(),
DBUser char(50) NOT NULL)
GO
-- Create DDL trigger
use <dbname>
GO
CREATE TRIGGER db_trg_ObjectChanges
ON DATABASE
FOR ALTER_PROCEDURE, DROP_PROCEDURE,
ALTER_INDEX, DROP_INDEX,
ALTER_TABLE, DROP_TABLE, ALTER_TRIGGER, DROP_TRIGGER,
ALTER_VIEW, DROP_VIEW, ALTER_SCHEMA, DROP_SCHEMA,
ALTER_ROLE, DROP_ROLE, ALTER_USER, DROP_USER
AS
SET NOCOUNT ON
INSERT dbo.ChangeAttempt
(EventData, DBUser)
VALUES (EVENTDATA(), USER)
GO
我的问题是:如何在一次运行中编程创建DDL触发器?为什么需要一次运行?这是唯一的办法
Msg 111, Level 15, State 1, Line 2
'CREATE TRIGGER' must be the first statement in a query batch.
运行此命令生成的输出:
DECLARE @DatabaseName varchar(500)
DECLARE @Database_id int
DECLARE @Query varchar(8000)
DECLARE @CRLF char(2)
SET @CRLF=CHAR(13)+CHAR(10)
---MODIFY THIS TO INCLUDE THE DATABASES THAT YOU WANT TO WORk ON
---MODIFY THIS TO INCLUDE THE DATABASES THAT YOU WANT TO WORk ON
select @Database_id=MIN(database_id) from sys.databases where database_id IN (5,7,8,6)
WHILE @Database_id IS NOT NULL
BEGIN
SELECT @DatabaseName=name from sys.databases where database_id=@Database_id
SET @Query='-- Create table'+@CRLF+@CRLF
+'use '+@DatabaseName+@CRLF
+' GO'+@CRLF
+' CREATE TABLE dbo.ChangeAttempt'+@CRLF
+' (EventData xml NOT NULL,'+@CRLF
+' AttemptDate datetime NOT NULL DEFAULT GETDATE(),'+@CRLF
+' DBUser char(50) NOT NULL)'+@CRLF
+'GO'+@CRLF+@CRLF
+'-- Create DDL trigger '+@CRLF+@CRLF
+'use '+@DatabaseName+@CRLF
+'GO'+@CRLF
+'CREATE TRIGGER db_trg_ObjectChanges'+@CRLF
+'ON DATABASE'+@CRLF
+'FOR ALTER_PROCEDURE, DROP_PROCEDURE,'+@CRLF
+' ALTER_INDEX, DROP_INDEX,'+@CRLF
+' ALTER_TABLE, DROP_TABLE, ALTER_TRIGGER, DROP_TRIGGER,'+@CRLF
+' ALTER_VIEW, DROP_VIEW, ALTER_SCHEMA, DROP_SCHEMA,'+@CRLF
+' ALTER_ROLE, DROP_ROLE, ALTER_USER, DROP_USER'+@CRLF
+'AS'+@CRLF
+'SET NOCOUNT ON'+@CRLF
+'INSERT dbo.ChangeAttempt'+@CRLF
+'(EventData, DBUser)'+@CRLF
+'VALUES (EVENTDATA(), USER)'+@CRLF
+'GO'+@CRLF
PRINT @Query
---MODIFY THIS TO INCLUDE THE DATABASES THAT YOU WANT TO WORk ON
---MODIFY THIS TO INCLUDE THE DATABASES THAT YOU WANT TO WORk ON
select @Database_id=MIN(database_id) from sys.databases WHERE database_id IN (5,7,8,6) AND database_id>@Database_id
END
编辑
要确定要为哪些数据库生成脚本,请执行以下操作:
运行此查询:
从sys.databases中选择database_id、name
查找要为其运行脚本的所有数据库
在循环之前和循环底部的两个位置更改我的上述脚本,以便您想要的所有数据库_id都位于以下代码部分:
其中,AAA、BBB、CCC、DDD等中的数据库_id
您可以使用sp_MSforeachdb 像这样的
sp_MSforeachdb
'
CREATE TABLE ?.dbo.ChangeAttempt
etc. etc. etc.
'
sp_MSforeachdb
'
CREATE TRIGGER ?.dbo.db_trg_ObjectChanges
etc. etc. etc.
'
我还没有测试过这个,理论上我希望它能工作。但是,您要确保排除系统数据库。我忘了提到,我想在SQL Server 2000中实现这种审核。我可以尝试做什么?当我在一些服务器上尝试时,输出缺少一些数据库,我可以通过查询sys.databases来实现。有什么意见吗?我明白了。非常感谢你的进一步解释。我编辑了我的问题,用了一个如何…那么现在有多快?我如何才能得到正确的答案,但没有增加投票数?这很快。我能够在几个小时内创建所有SQL Server。对不起,我不知道你说的增加选票是什么意思。我该怎么做?