2009-06-03 9 views
2

Je vais créer un déclencheur DDL pour toutes les bases de données dans l'instance SQL Server. Je voudrais le faire en une seule fois au lieu de plusieurs fois pour chaque base de données.Comment créer un déclencheur DDL pour toutes les bases de données dans l'instance SQL Server 2005

Voici les deux instructions T-SQL que je dois exécuter:

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

Ma question est: comment puis-je créer programmaticaly déclencheur DDL dans une course?

+0

J'ai édité ma question avec un comment ... –

+0

alors à quelle vitesse est-il maintenant? Comment puis-je obtenir la bonne réponse, mais pas de votes? –

+0

c'est rapide. Je suis capable de faire la création de tous les serveurs SQL en quelques heures. Je suis désolé, je ne sais pas ce que vous voulez dire par «voter». Comment je fais ça? – titanium

Répondre

1

pourquoi avez-vous besoin d'une course? C'est la seule façon de le faire.

Msg 111, Level 15, State 1, Line 2 
'CREATE TRIGGER' must be the first statement in a query batch. 

exécuter la sortie générée par ceci:

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 [email protected]_id 
    SET @Query='-- Create table'[email protected][email protected] 
       +'use '[email protected][email protected] 
       +' GO'[email protected] 
       +' CREATE TABLE dbo.ChangeAttempt'[email protected] 
       +' (EventData xml NOT NULL,'[email protected] 
       +' AttemptDate datetime NOT NULL DEFAULT GETDATE(),'[email protected] 
       +' DBUser char(50) NOT NULL)'[email protected] 
       +'GO'[email protected][email protected] 
       +'-- Create DDL trigger '[email protected][email protected] 
       +'use '[email protected][email protected] 
       +'GO'[email protected] 
       +'CREATE TRIGGER db_trg_ObjectChanges'[email protected] 
       +'ON DATABASE'[email protected] 
       +'FOR ALTER_PROCEDURE, DROP_PROCEDURE,'[email protected] 
       +' ALTER_INDEX, DROP_INDEX,'[email protected] 
       +' ALTER_TABLE, DROP_TABLE, ALTER_TRIGGER, DROP_TRIGGER,'[email protected] 
       +' ALTER_VIEW, DROP_VIEW, ALTER_SCHEMA, DROP_SCHEMA,'[email protected] 
       +' ALTER_ROLE, DROP_ROLE, ALTER_USER, DROP_USER'[email protected] 
       +'AS'[email protected] 
       +'SET NOCOUNT ON'[email protected] 
       +'INSERT dbo.ChangeAttempt'[email protected] 
       +'(EventData, DBUser)'[email protected] 
       +'VALUES (EVENTDATA(), USER)'[email protected] 
       +'GO'[email protected] 
    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 

EDIT
pour déterminer quelles bases de générer des scripts pour effectuer les opérations suivantes:

  • exécuter cette requête:

    s élu database_id, le nom de sys.databases

  • trouver toutes les bases de données que vous souhaitez exécuter les scripts pour

  • changer mon script ci-dessus en deux endroits (avant boucle & en bas en boucle) de sorte que tous du database_id que vous voulez sont dans la section de code suivant:

    OÙ database_id IN (AAA, BBB, CCC, DDD, ....)

+0

Merci pour le script. Ça fonctionne bien. – titanium

+0

J'ai oublié de mentionner, je voudrais mettre en œuvre ce type d'audit dans SQL Server 2000. Quelles sont les options que je peux essayer de faire cela? – titanium

+0

Lorsque je l'ai essayé sur certains serveurs, la sortie manque de certaines bases de données en interrogeant sys.databases. Toute opinion pourquoi? – titanium

0

vous co uld utiliser sp_MSforeachdb.

Quelque chose comme ça

sp_MSforeachdb 
' 
    CREATE TABLE ?.dbo.ChangeAttempt 
     etc. etc. etc. 
' 
sp_MSforeachdb 
' 
    CREATE TRIGGER ?.dbo.db_trg_ObjectChanges 
     etc. etc. etc. 
' 

Je n'ai pas testé, en théorie je pense que cela fonctionne bien. Vous voulez vous assurer d'exclure les bases de données du système.

Questions connexes