LINQ to SQL Не удается создать базу данных [Разрешения схемы] - PullRequest
7 голосов
/ 12 октября 2009

Для некоторых интеграционных тестов я хочу использовать LINQ to SQL, чтобы удалить / заново создать тестовую базу данных. Раньше у меня это работало нормально, однако в этом проекте база данных разбита на несколько схем.

Когда я пытаюсь выполнить команду ctx.CreateDatabase(), я получаю следующее исключение:

Указанное имя схемы "xyz" либо не существует или у вас нет разрешение на его использование.

Логин, который я использую для этого, имеет роль dbcreator - Требуются ли дополнительные разрешения? Конечно, логин с разрешениями для создания базы данных должен иметь возможность создавать все, что содержится в этой базе данных?

Обновление:

Поскольку, похоже, что нет решения этой проблемы с использованием LINQtoSQL, есть ли у кого-нибудь рекомендации каких-либо аналогичных инструментов для генерации БД, которые предпочтительно бесплатны? В идеале, я не хочу отрицать, что нужно писать сценарии сборки SQL.

Ответы [ 6 ]

3 голосов
/ 15 октября 2009

Из того, что я прочитал, метод CreateDatabase () ограничен в том, что он может воспроизводить из исходной базы данных. Он не будет воссоздавать такие вещи, как триггеры и проверки ограничений, и я предполагаю, что он также не создает пользовательских схем. Возможно, вы захотите изучить создание базы данных с помощью SQL Server .mdf файла, чтобы обойти эту проблему. См. эту запись в блоге для более подробной информации о некоторых ограничениях CreateDatabase ().

1 голос
/ 29 июня 2012

На самом деле LINQ to SQL поддерживает схемы, но не все версии Sql Server поддерживают. Чтобы позволить CreateDatabase() генерировать их, DataContext должен знать, что целевая база данных поддерживает их. Это можно сделать, установив провайдера на DataContext:

[Provider(typeof(Sql2008Provider))]
public class CustomDataContext : DataContext {
   ...
}
1 голос
/ 19 октября 2009

Предопределенная роль сервера dbcreator предоставляет вам разрешение на создание базы данных. Если вы создаете базу данных, то вы являетесь dbo указанной базы данных, и как dbo вы обладаете абсолютной властью в базе данных, включая способность создавать, изменять и удалять любую схему и любой объект, содержащийся в любой схеме.

проблема с LINQ CreateDatabase () не в разрешении, а в качестве кода. Сгенерированный код SQL просто не создает необходимую схему, поэтому операторы Создать таблицу не выполняются, поскольку схема не существует.

Наилучшим выбором, если вы можете себе это позволить, является добавление проекта VSTS Database Edition GDR R2 к вашему решению и объявление всех объектов базы данных в проекте Database Edition (часть вашего решения). Вы также получите дополнительное преимущество хранения всех ваших объектов базы данных в правильном решении для контроля версий. Результатом проекта Database будет файл .dbschema, содержащий определение вашей базы данных. Во время развертывания (тестовое или реальное) вы должны запустить VSDBCMD Средство развертывания и импорта схемы , чтобы импортировать вашу .dbschema на целевой сервер. Инструмент способен выполнять начальное развертывание вашей схемы, а также дальнейшие обновления (развертывать только различия). Решение VSDB позволит вам контролировать все объекты базы данных: таблицы, индексы, представления, схемы, ограничения полей, ограничения таблиц, триггеры, процедуры, пользователи, разрешения, логины и т. Д. И т. Д. Оно действительно охватывает все объекты, которые могут быть определены в SQL Server.

1 голос
/ 13 октября 2009

Обычно я делаю такую ​​работу в NAnt, чтобы создавать, инициализировать базу данных, создавать пользователей, добавлять логины и т. Д., А также откатывать возможности. Я написал немного на эту тему, если вам интересно:

Автоматизация сборки с помощью NAnt

Непрерывная интеграция с CruiseControl.NET

Мне нужно посмотреть, смогу ли я заставить LINQ to SQL работать так, как вы пытаетесь его использовать ... это похоже на то, что мы делали с NHibernate.

0 голосов
/ 26 октября 2009

Я бы определенно посмотрел на Entity Framework, который я начинаю изучать в эти дни. Это OR / M, и он наиболее точно подойдет вашим потребностям, и намного больше, когда выйдет следующая версия.

Entity Framework также является детищем Microsoft и находится здесь: http://msdn.microsoft.com/en-us/library/aa697427(VS.80).aspx

Одна вещь, которую следует помнить между LINQ to SQL и LINQ to Entities, - это то, что вы программируете для модели, а не для базы данных.

0 голосов
/ 12 октября 2009

Вашему пользователю также требуется db_dlladmin для этой базы данных.

...