DECLARE @DatabaseName NVARCHAR(255);
DECLARE @LogFileName NVARCHAR(255);
DECLARE @OriginalRecoveryModel NVARCHAR(50);
DECLARE @Sql NVARCHAR(MAX);
-- Cursor über alle Datenbanken außer Systemdatenbanken
DECLARE DatabaseCursor CURSOR FOR
SELECT name
FROM sys.databases
WHERE state = 0 -- Nur Online-Datenbanken
AND name NOT IN ('master', 'tempdb', 'model', 'msdb'); -- Systemdatenbanken ausschließen
OPEN DatabaseCursor;
FETCH NEXT FROM DatabaseCursor INTO @DatabaseName;
WHILE @@FETCH_STATUS = 0
BEGIN
-- Ermitteln des aktuellen Recovery Models
SELECT @OriginalRecoveryModel = recovery_model_desc
FROM sys.databases
WHERE name = @DatabaseName;
-- Hole den logischen Namen der Log-Datei
SELECT @LogFileName = name
FROM sys.master_files
WHERE database_id = DB_ID(@DatabaseName)
AND type_desc = 'LOG';
-- Recovery Model auf SIMPLE umstellen
SET @Sql = 'ALTER DATABASE [' + @DatabaseName + '] SET RECOVERY SIMPLE;';
PRINT 'Executing: ' + @Sql;
EXEC(@Sql);
-- Log-Datei schrumpfen
SET @Sql = 'USE [' + @DatabaseName + ']; DBCC SHRINKFILE ([' + @LogFileName + '], 1);';
PRINT 'Executing: ' + @Sql;
EXEC(@Sql);
-- Ursprüngliches Recovery Model wiederherstellen
IF @OriginalRecoveryModel = 'FULL'
SET @Sql = 'ALTER DATABASE [' + @DatabaseName + '] SET RECOVERY FULL;';
ELSE IF @OriginalRecoveryModel = 'BULK_LOGGED'
SET @Sql = 'ALTER DATABASE [' + @DatabaseName + '] SET RECOVERY BULK_LOGGED;';
ELSE
SET @Sql = 'ALTER DATABASE [' + @DatabaseName + '] SET RECOVERY SIMPLE;';
PRINT 'Reverting Recovery Model: ' + @Sql;
EXEC(@Sql);
FETCH NEXT FROM DatabaseCursor INTO @DatabaseName;
END;
CLOSE DatabaseCursor;
DEALLOCATE DatabaseCursor;
Das Script liest den aktuellen Recovery Modus der Datenbank aus, stellt diesen auf SIMPLE um, verkleinert die Transaktionsprotokolle und stellt den Recovery Modus wieder auf den ursprünglichen Eintrag zurück.