Announcement

Collapse
No announcement yet.

Trigger in Schleife auf verschiedene Datenbanken

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Trigger in Schleife auf verschiedene Datenbanken

    Hallo!

    Ich habe folgendes Problem:
    Ich habe eine Reihe von Datenbanken, welche alle dieselben Tabellen enthalten, allerdings mit unterschiedlichen Daten. Die Datenbanken liegen alle auf demselben Server.
    Ich möchte nun eine update-Routine entwickeln, um die Tabellen, Trigger usw. immer wieder auf einen neuen Stand bringen zu können.

    Folgendes habe ich mir überlegt - was auch schon funktioniert:
    - ich lese mir alle existierenden Datenbanken aus
    - mittels cursor wird in einer schleife eine datenbank nach der anderen durchlaufen und die entsprechenden updates durchgeführt.
    siehe Beispiel.

    Code:
    DECLARE @DB_NAME VARCHAR(20);
    DECLARE @COMMAND VARCHAR(3000); 
    
    DECLARE db_cursor CURSOR FOR
    SELECT Name FROM SYSDATABASES  WHERE name = [MeineNamesStruktur] ORDER BY NAME;
    OPEN db_cursor
    
    FETCH NEXT FROM db_cursor INTO @DB_NAME
    WHILE @@FETCH_STATUS = 0
    BEGIN
    
    SET @COMMAND = 'USE ' + @DB_NAME + ' ' + '
    IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ''CYCLE_TIME'' AND COLUMN_NAME = ''TSTAMP'')
     ALTER TABLE CYCLE_TIME ADD TSTAMP DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL'
    EXEC(@COMMAND)
    
    SET @COMMAND = 'USE ' + @DB_NAME + ' ' + '
    CREATE TRIGGER [dbo].T_PD_TODAY ON [' + @DB_NAME + '].[dbo].[PD] AFTER INSERT
    AS BEGIN
    	SET NOCOUNT ON;
        INSERT INTO [' + @DB_NAME + '].[dbo].[PD_TODAY] SELECT * FROM INSERTED
    END'
    EXEC(@COMMAND)
    
    ....
    
    FETCH NEXT FROM db_cursor INTO @DB_NAME
    END
    CLOSE db_cursor
    DEALLOCATE db_cursor
    GO

    Es wird also mit der USE-Anweisung auf die zu beschreibende Datenbank verwiesen und anschließend das entsprechende Kommando ausgeführt. Funktioniert mit CREATE,ALTER,DROP Table usw.
    Das ganze funktioniert bei CREATE TRIGGER aber nicht mehr, da die Create Anweisung die erste Anweisung im Batch sein muss. Siehe auch folgende Fehlermeldung:
    Meldung 111, Ebene 15, Status 1, Zeile 2
    'CREATE TRIGGER' muss die erste Anweisung in einem Abfragebatch sein.

    Daher meine Frage(n):
    - Kann ich die 'aktuelle Tabelle' dauerhaft umstellen, damit ich nicht in jeder Batch-Anweisung USE verwenden muss?
    - Wie würdet Ihr an solch eine Aufgabenstellung herangehen?

    Vielen Dank für Eure Hilfe!!
    Zuletzt editiert von jv_s; 28.07.2009, 10:04.

  • #2
    Kann man das nicht ändern, indem man die CREATE's nicht von der Quelldatenbank aus macht sondern sich zuerst in die Zieldatenbank stellt und dann erst die Scripts ausführt?

    bye,
    Helmut

    edit:
    das schon probiert:
    ...
    SET @COMMAND = 'USE ' + @DB_NAME + '; GO; ' + '
    CREATE TRIGGER [dbo].T_PD_TODAY ON [' + @DB_NAME + '].[dbo].[PD] AFTER INSERT
    AS BEGIN
    ...

    Comment


    • #3
      Hallo Helmut,

      genau das ist mein Problem. Ich kann micht nicht in die Zieldatenbank stellen - zumindest weiß ich nicht wie.
      Das "GO" funktioniert an der Stelle nicht, da dieser Befehl kein SQL Befehl darstellt sondern vom Management-Studio interpretiert wird. Daher kann GO an der Stelle nicht verwendet werden.

      Gruß Jens

      Comment


      • #4
        Ach ja das GO, da falle ich immer wieder drüber

        Aber es geht, wenn man das in zwei exec's teilt, etwa so:

        exec('USE ' + @DB_NAME + '; ' + 'EXEC(''CREATE TRIGGER ... '')')

        Aufpassen muss man allerdings mit den Hochkommas der Strings, weil sich die einfachen verdoppeln und die doppelten nochmals verdoppeln! Aber wenn man die mal richtig gesetzt hat, dann funktioniert's, habe es gerade bei einem meiner Trigger ausprobiert

        bye,
        Helmut

        Comment


        • #5
          Mensch Helmut,

          is ja genial, auf die Idee bin ich nicht gekommen.
          Es funktioniert und Du hast mir mit Sicherheit viele entnervte Nächte erspart
          Tausend Dank!!!

          Viele Grüße
          Jens

          Comment

          Working...
          X