Как внести живые изменения в SQL Server Express
Я разрабатывал веб-приложение asp.net, используя VS studio. Я использую SQL Server Express. Во время разработки я тестировал свое веб-приложение на своем сервере.
Каждый раз, когда мне нужно обновить базу данных, я просто удаляю старую базу данных (расположенную на моем сервере) и загружаю новую базу данных. Поскольку я только тестирую, а у моего приложения нет пользователей, это не было проблемой.
Проблема:
Как только мой сайт заработает, я не знаю, как внести изменения в мою базу данных. Очевидно, я не смогу просто удалить его, так как он будет содержать пользовательские данные. Так как же люди обычно обновляют живую БД. То есть, допустим, мой сайт работает, и теперь мне нужно добавить больше таблиц и хранимых процедур в мою БД. Как бы я сделал это на живом сайте?
4 ответа
Чтобы внести изменения в производственную базу данных, вы должны:
- Попробуйте запланировать отключение, когда будет затронуто наименьшее количество пользователей, разместив информацию, чтобы пользователи знали до
- Используйте сценарии на языке определения данных (DDL), чтобы внести изменения в таблицы базы данных, и, возможно, сценарии на языке манипулирования данными (DML), чтобы объединить существующие данные с необходимостью этих изменений.
Сценарии, необходимые для шага 2, должны быть протестированы в средах разработки и тестирования / контроля качества, чтобы обеспечить как можно меньше проблем в производственной системе. Резервные копии, которые позволяют восстановить базу данных в предыдущих версиях приложения, необходимы как для сред разработки, так и для тестирования / контроля качества.
Вам либо нужно:
- Обновите свою базу данных в то время, когда никто не будет использовать сайт. ИЛИ ЖЕ
- Убедитесь, что ваши обновления не влияют на работу сайта.
Второй вариант включает в себя предоставление любых новых ненулевых столбцов разумных значений по умолчанию, гарантируя, что все операторы INSERT используют списки столбцов (например, INSERT INTO dbo.MyTable (col1, col2, col3) VALUES (...)
) и обеспечение того, чтобы новые параметры хранимой процедуры имели значения по умолчанию. Это не исчерпывающий список, но хорошее начало.
В основном мы создаем сценарии выпуска, посредством которых изменения записываются и повторяются. Таким образом, вы увидите такие вещи, как
IF NOT EXISTS( SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName')
BEGIN
ALTER TABLE myTableName
ADD myColumnName varchar(50)
END
Вы можете сказать, какие объекты изменились, например:
SELECT
[name],
create_date,
modify_date
FROM sys.tables
ORDER BY
modify_date DESC
Некоторые люди используют программное обеспечение RedGate для сравнения двух разных баз данных, но это обходится дорого.
Это зависит от того, какие изменения вы хотите внести в вашу живую базу данных.
В своем вопросе вы говорите только о добавлении новых таблиц и хранимых процедур.
Пока вы только добавляете новые вещи (таблицы, таблицы или даже новые столбцы в существующие таблицы), вам не нужно делать ничего особенного, потому что SQL Server может делать это, когда база данных используется, и изменения не влияют ваши пользователи, потому что их версия вашего приложения даже не знает о ваших новых добавленных материалах.
С другой стороны, это становится намного сложнее, если вы измените или даже удалите существующий материал.
Существует большая вероятность, что это будет серьезное изменение для вашего приложения, поскольку оно, вероятно, перестанет работать, когда таблицы будут выглядеть иначе, чем он ожидает, или если оно попытается получить доступ к таблицам /sprocs, которые больше не существуют.
(Даже если вы добавляете только новые вещи, как я сказал вначале - вы, возможно, захотите обновить свое приложение в любом случае, чтобы оно могло фактически использовать новый материал в базе данных)
Поэтому вам, вероятно, потребуется внести изменения в базу данных и одновременно развернуть новую версию приложения.
Я не эксперт по ASP.NET, но, насколько я знаю, невозможно обновить приложение ASP.NET без исключения всех активных пользователей.
Поэтому в этом случае вам придется сделать то, что OMG Ponies уже сказал: выберите время, когда затронуто минимально возможное количество пользователей, и / или заблаговременно сообщите своим пользователям о запланированном сбое.