MS-SQL: общее изменение параметров FileGrowth базы данных

В нашем программном обеспечении пользователь может создавать базы данных, а также подключаться к базам данных, которые не были созданы нашим программным обеспечением. СУБД — 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 для этого соединения, поэтому лучше всего использовать «чистый» сценарий, если это возможно.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
224
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Следующий сценарий получает имя базы данных в качестве параметра и использует 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.

Спасибо! Можете ли вы сказать мне, должно ли это работать на каждом MS SQL Server с 2008 R2 по 2019 год? Или используется что-то слишком новое для 2008 R2 или слишком старое для 2019 года?

Nostromo 31.01.2019 17:21
sys.database_files был включен с 2008 года, а ALTER DATABASE для изменения файлов уже был доступен с 2005 года, так что все должно быть в порядке.
EzLo 31.01.2019 17:25

Другие вопросы по теме