В нашем программном обеспечении пользователь может создавать базы данных, а также подключаться к базам данных, которые не были созданы нашим программным обеспечением. СУБД — Microsoft SQL-Server.
Теперь мне нужно обновить базы данных, которые мы используем, и установить для параметра FileGrowth всех файлов всех баз данных определенное значение.
Я знаю, как получить логические имена файлов текущей базы данных из запроса:
SELECT file_id, name as [logical_file_name], physical_name FROM sys.database_files
И я знаю, как установить нужное значение FileGrowth, если я знаю логическое имя файла:
ALTER DATABASE MyDB MODIFY FILE (Name='<logical file name>', FileGrowth=10%)
Но я не знаю, как объединить эти шаги в один скрипт.
Поскольку существуют различные базы данных, я не могу жестко закодировать логические имена файлов в сценарии. И для процесса обновления (прямо сейчас) у нас есть только возможность получить соединение с базой данных и выполнить сценарии sql для этого соединения, поэтому лучше всего использовать «чистый» сценарий, если это возможно.


Следующий сценарий получает имя базы данных в качестве параметра и использует 2 динамических SQL: один для курсора для циклического переключения файлов базы данных выбранной базы данных, а другой для применения соответствующей команды ALTER TABLE, поскольку вы не можете использовать переменную для имени файла на MODIFY FILE.
EXEC комментируется в обоих случаях, и вместо него есть PRINT, поэтому вы можете просмотреть его перед выполнением. Я только что протестировал его в своей песочнице, и он работает так, как ожидалось.
DECLARE @DatabaseName VARCHAR(100) = 'DBName'
DECLARE @DynamicSQLCursor VARCHAR(MAX) = '
USE ' + @DatabaseName + ';
DECLARE @FileName VARCHAR(100)
DECLARE FileCursor CURSOR FOR
SELECT S.name FROM sys.database_files AS S
OPEN FileCursor
FETCH NEXT FROM FileCursor INTO @FileName
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @DynamicSQLAlterDatabase VARCHAR(MAX) = ''
ALTER DATABASE ' + @DatabaseName + ' MODIFY FILE (Name = '''''' + @FileName + '''''', FileGrowth = 10%)''
-- EXEC (@DynamicSQLAlterDatabase)
PRINT (@DynamicSQLAlterDatabase)
FETCH NEXT FROM FileCursor INTO @FileName
END
CLOSE FileCursor
DEALLOCATE FileCursor '
-- EXEC (@DynamicSQLCursor)
PRINT (@DynamicSQLCursor)
Возможно, вы захотите проверить обычные предостережения динамического SQL, например убедиться, что объединяемые значения не нарушат SQL, а также добавить обработку ошибок.
Что касается того, как применить это к нескольким базам данных, вы можете создать SP и выполнить его несколько раз или наложить на него курсор имени базы данных / цикл while.
sys.database_files был включен с 2008 года, а ALTER DATABASE для изменения файлов уже был доступен с 2005 года, так что все должно быть в порядке.
Спасибо! Можете ли вы сказать мне, должно ли это работать на каждом MS SQL Server с 2008 R2 по 2019 год? Или используется что-то слишком новое для 2008 R2 или слишком старое для 2019 года?