--select * from [master].[sys].[databases] --where not name in ('master','tempdb','model','msdb') declare @name nvarchar(512) declare @cmd nvarchar(512) DECLARE @Cursor CURSOR SET @Cursor = CURSOR FOR select name from [master].[sys].[databases] where not name in ('master','tempdb','model','msdb') OPEN @Cursor FETCH NEXT FROM @Cursor INTO @name WHILE (@@FETCH_STATUS = 0) BEGIN --print @name set @cmd = 'USE ['+@name+'] GO DBCC SHRINKFILE (N'''+@name+ '_log'', 0, TRUNCATEONLY) GO' print @cmd --exec (@cmd) FETCH NEXT FROM @Cursor INTO @name end
Similar Posts:
- Шринк логов (сжать логи) у всех баз на сервере
- Как сделать бэкап множества баз mssql на сетевое хранилище с созданием папок под бэкап. И после удалить эти базы.
- перевод всех бд в simple
- Создание n баз из одного бэкапа под разными именами
- Как добавить права чтения или записи на базу, сразу многим пользователям.
Как учесть в скрипте то, что логические имена файлов часто не совпадают с именами баз?
зачем это учитывать ? скрипт сам берет название файлов из sql.
Автор, ваш скрипт берёт имя ФАЙЛА и прицепляет к нему _log, а shrinkfile работает с логическими именами, которые действительно иногда не совпадают с физическими именами файлов баз данных. Особенно актуально для тестовых и отладочных баз. Если есть workbase.mdf + workbase_log.ldf, то логическое имя этой базы будет workbase, если я сделаю копию базы workbase к примеру в test1.mdf + test1_log.ldf, то логическое имя внутри сохранится как workbase и конструкция use test1, dbcc shrinkfile (test1_log) выдаст ошибку – не существует test1_log.