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.
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!!
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!!
Comment