Проблема курицы и яйца (восстановление базы данных) при попытке написать модульный тест для SQl Server 2008 - PullRequest
1 голос
/ 07 января 2011

Хорошо, это не юнит-тесты, а сквозные тесты.Установка несколько вовлечена.Модульные тесты будут использовать C #, ODBC соединение.Каждый модульный тест будет пытаться очистить после себя, но каждые 20 тестов или около того (один раз для класса C #) нам нужно будет выполнить полное восстановление базы данных.Я не думаю, что могу сделать это через соединение ODBC, в соответствии с этим документом:

http://www.sql -server-performance.com / article / dba / Obtain_Exclusive_Access_to_Restore_SQL_Server_p1.aspx

Сообщение 6104, уровень 16, состояние 1, строка 1 Не удается использовать KILL для уничтожения собственного процесса.

Однако я бы хотел, чтобы 199 тестов не выходили из-под контроляиз-за плохой уборки.Есть ли другой способ?Возможно, я могу открыть другое «соединение», например, использовать автоматизацию COM или что-то в этом роде, а затем убить все соединения с базой данных оттуда?Если да, то как я могу это сделать?

Кроме того, смогут ли клиенты автоматически восстанавливать соединение после восстановления или мне придется разбирать все раз в 20 тестов или около того?

Если вы считаете этот вопрос запутанным, пожалуйста, дайте мне знать, каковы ваши вопросы.Спасибо!

Ответы [ 2 ]

1 голос
/ 07 января 2011

Конечно, вы можете восстановить из ODBC-соединения.Вы не можете восстановить, если вы используете базу данных, которую вы пытаетесь восстановить, но тривиально изменить контекст на tempdb или master:

USE [tempdb];
RESTORE DATABASE foo FROM ...;

Если есть другие соединения, которые используют базуони будут вашими собственными соединениями, поэтому нужно просто убедиться, что вы их правильно закрыли.Если вы используете пул соединений, очистите пул.SqlClient использует SqlConnectionClearAllPools, ODBC использует OdbcConnection.ReleaseObjectPool с аналогичным эффектом.Дело в том, что все под вашим контролем.

Кстати, есть ли причина, по которой вы используете ODBC, а не SqlClient?

1 голос
/ 07 января 2011

Если вы можете быть уверены, что можете правильно закрыть свои соединения ODBC, то для тестирования интеграции с C # вы можете использовать ADO.NET напрямую для восстановления нового соединения из пула.

Я думаю, что если вы переключите восстановление из снимков, а не из полных резервных копий, вы, возможно, найдете это намного быстрее.

...