Выполните вход в dbo для базы данных на SQL Server

#sql-server-2005 #sql-server-2008 #shared-hosting

#sql-server-2005 #sql-server-2008 #общий хостинг

Вопрос:

Я пытаюсь выполнить миграцию с SQL Server 2005 на SQL Server 2008. Оба этих экземпляра базы данных размещены на сторонних общих серверах, к которым у меня нет полных разрешений. Они используют аутентификацию в смешанном режиме.

У меня возникли проблемы с настройкой новой базы данных таким же образом, как была настроена старая. В частности, новая веб-панель управления не позволяет указывать dbo при создании новой базы данных, а затем при использовании Red Gate SQL Compare для синхронизации схем у меня возникают проблемы, потому что некоторые объекты (которые явно не указывают dbo в сценарии) создаются с префиксом учетной записи пользователя, а не dbo.

Я перерыл документацию, пытаясь найти способ принудительно ввести мой логин «user1» как dbo в базу данных «db1». Я пришел к выводу, что скрипт должен выглядеть следующим образом:

 ALTER AUTHORIZATION ON DATABASE::db1 TO user1
  

Перед запуском этого скрипта имя пользователя «user1» уже существует, но не является пользователем для базы данных «db1». Примечание. Мне пришлось отправить этот скрипт в службу поддержки моей хостинговой компании, чтобы запустить его. По словам хостинговой компании, инструкция успешно выполняется, однако, когда я сравниваю базы данных с использованием SQL Compare, пользователь «user1» не был физически добавлен в базу данных, как это было в SQL Server 2005. При попытке добавить ее с помощью скрипта:

 CREATE USER [user1] FOR LOGIN [user1] WITH DEFAULT_SCHEMA=[dbo]
  

Я получаю сообщение об ошибке:

 "The login already has an account under a different username"
  

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

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

Итак, мои вопросы: Есть ли другая инструкция, которую мне нужно выполнить, чтобы добавить «user1» в базу данных в качестве пользователя, являющегося dbo? Изменилось ли что-нибудь в реализации между SQL Server 2005 и SQL Server 2008 R2, что могло вызвать эти несоответствия?

К сожалению, я не могу протестировать, чтобы найти ответ на второй вопрос, потому что у меня нет другой базы данных SQL Server 2008 для тестирования, и у меня нет полного доступа, чтобы делать с ней все, что я хочу.

Старая база данных была создана через панель управления, которая принудительно указывала dbo, а новая не позволяет указывать dbo при создании базы данных.

Комментарии:

1. итак, [user1] — это вход на уровне sql server, его можно увидеть в master.dbo.syslogins, а в [database].dbo.sysusers нет пользователя с таким же sid

2. Спасибо за помощь. Да, это именно тот случай. Что мне делать дальше?

3. Просто просматривал это снова этим утром, и мне удалось воссоздать ту же ошибку. Однако вы уже сказали, что «удалили всех других пользователей»… Вы удалили user1 в базе данных и воссоздали ее тоже? Попробуйте следующий код, чтобы увидеть все сопоставления между логинами и пользователями «выберите l.name как ServerLoginName, u.name как DatabaseUserName из [database].dbo.sysusers u присоединитесь к master.dbo.syslogins l на u.sid = l.sid»

4. Нет, я не удалял «user1» раньше. Я выполнил запрос и получил 1 результат — ServerLoginName: user1, DatabaseUserName: dbo. Я думаю, это объясняет, почему я не могу создать пользователя db. Я запустил тот же запрос в рабочей среде, и DatabaseUserName было «user1», а не «dbo». Я нашел msdn.microsoft.com/en-us/library/aa905208(v=sql.80).aspx что лучше объясняет проблему — мой текущий логин не сопоставлен с «dbo», но является членом роли системного администратора. Теперь остается только создать скрипт, который сделает логин членом sysadmin — в настоящее время я не знаю, как это сделать, хотя.

5. Упс, я предполагаю, что рабочий пользователь не является членом sysadmin (запустил sp_helpsrvrolemember для проверки). В таком случае я понятия не имею, как старый пользователь мог создавать объекты с префиксом «dbo». Однако, поскольку мой новый логин сопоставлен с «dbo», он должен быть функционально эквивалентен старому пользователю — я думаю, я мог бы просто создать копию рабочей базы данных и изменить пользователей, чтобы они соответствовали новому серверу, и тогда я смогу синхронизировать схему с копией (теоретически).

Ответ №1:

Из того, что я собрал, должно быть достаточно следующего.

 ALTER USER [user1] WITH DEFAULT_SCHEMA=[dbo]
  

Создание не работало, поскольку оно уже существовало.

Комментарии:

1. Чем это отличается от того, что у меня уже есть? Я имею в виду, что «user1» уже dbo, верно? Является ли предоставление dbo схемы по умолчанию функционально эквивалентным предоставлению пользователю dbo (в отношении создания объектов)?

2. за исключением того, что вы были обеспокоены созданием новых таблиц / функций в схеме user1, поэтому вы заявили, что вам пришлось бы явно указывать dbo. [имя таблицы]. Установив схему по умолчанию в dbo, вам не нужно будет указывать dbo в сообщениях о создании

3. Хорошо, я протестировал этот метод с помощью SQL Compare, и он сработал — именно поэтому сервер 2005 действовал так, как было. Кроме того, если база данных обновляется таким образом, не требуется запрос в службу поддержки для запуска каких-либо SQL-скриптов, на запуск которых у меня нет разрешения.