Настройте службы приложений ASP.NET для использования схемы, отличной от dbo

Я хочу использовать службы приложений ASP.NET, но настроить их для использования другой схемы. Я использую инструмент aspnet_regsql.exe, как описано в этом URL-адрес, который по умолчанию создает таблицы и хранит процессы со схемой dbo.

Поэтому я подумал, что могу просто сгенерировать сценарий базы данных из существующих объектов приложения, а затем найти и заменить [dbo] на [пример], а затем удалить исходные объекты служб приложений и выполнить отредактированный сценарий, чтобы получить желаемый результат. Взял бы только мгновение.

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

Итак, я нахожусь на стадии моделирования данных, и мне действительно не нужно много хлопот в будущем. Кто-нибудь знает, было ли это решено или в подходе поиска и замены к проблеме схемы dbo продолжают возникать какие-либо препятствия?

ОБНОВЛЕНИЕ:

Так что я даже не успел «продвинуться очень далеко по трассе», прежде чем вышеперечисленное упало. Очевидно, что достаточно легко настроить базу данных, чтобы все объекты должным образом ссылались друг на друга с использованием новой схемы, но, похоже, весь код поддержки содержит в себе зашитые ссылки "dbo" ... вместо использования схемы по умолчанию для подключающейся учетной записи пользователя .

Просто пытаюсь использовать VS Studio> Проект | Инструмента НАСТРОЙКА ASP.NET достаточно, чтобы его сломать. После изменения веб-конфигурации, указывающей на новую базу данных с настроенными схемами, а затем перехода на вкладку «Безопасность» инструментов конфигурации, я получаю сообщение об ошибке «Не удалось найти хранимую процедуру 'dbo.aspnet_CheckSchemaVersion'». Таким образом, похоже, что 'dbo' был запечен. :(

ОБНОВЛЕНИЕ 2:

Итак, я добавил СИНОНИМЫ, как указано в принятом ответе и он работает, но мне пришлось ввести 4 записи в базу данных, чтобы начать работу. Это заняло целых 30 секунд. ;)

Перед этим я получил следующую ошибку:

'System.Web.Security.SqlMembershipProvider' требует схемы базы данных, совместимой с версией схемы '1'

Поэтому мне пришлось скопировать строку приложения из таблицы aspnet_Applications. А затем 3 строки из таблицы aspnet_SchemaVersions. Я получил их при установке схемы dbo по умолчанию.

Это была запись aspnet_Applications (замаскирована xxxx для уникальности - вам придется создать свой собственный ключ):

/   /  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  NULL

Это были записи aspnet_SchemaVersions:

common  1   True

membership  1   True

role manager    1   True

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


person rism    schedule 15.02.2010    source источник


Ответы (2)


В этом случае ответ, скорее всего, заключается в использовании Sql Server SYNONYMS, которые похожи на псевдонимы. В этой статье Как и почему я должен использовать синонимы SQL Server 2005? есть введение им.

Вы в основном хотите:

CREATE SYNONYM   
     [dbo].[aspnet_CheckSchemaVersion]
FOR  
     [yourschema].[aspnet_CheckSchemaVersion]

Для каждого затронутого объекта. Это может занять много времени, поэтому этот сценарий, скорее всего, принесет некоторую пользу:

SELECT 'CREATE SYNONYM [dbo].[' + p.Name + '] FOR [' + s.Name + '].[' + p.Name + ']' FROM sys.Procedures p INNER JOIN 
sys.Schemas s on p.schema_id = s.schema_id

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

Если вы затем выполните вывод вышеуказанного скрипта, он создаст синонимы для всех процедур в базе данных.

Так что обратите внимание:

  1. Предполагается, что у вас есть база данных, содержащая только процессы Application Services. Если у вас есть свои собственные процедуры, вам нужно будет добавить условие WHERE для фильтрации только для объектов Application Services, которые начинаются с aspnet_, т.е.

    ГДЕ p.name КАК 'aspnet_%'.

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

  3. Стоимость использования SYNONYM будет зависеть от приложения.

Похоже, проблем много, но вся процедура, вероятно, займет у вас 3-4 минуты.

person intermension    schedule 15.02.2010

Результат выполнения приведенного выше сценария будет следующим, поэтому вы можете просто скопировать и вставить его и запустить поиск и заменить его для 'yourschema', чтобы получить сценарий сборки SYNONYM:

CREATE SYNONYM [dbo].[aspnet_UnRegisterSchemaVersion] FOR [yourschema].[aspnet_UnRegisterSchemaVersion]
CREATE SYNONYM [dbo].[aspnet_RegisterSchemaVersion] FOR [yourschema].[aspnet_RegisterSchemaVersion]
CREATE SYNONYM [dbo].[aspnet_CheckSchemaVersion] FOR [yourschema].[aspnet_CheckSchemaVersion]
CREATE SYNONYM [dbo].[aspnet_Membership_CreateUser] FOR [yourschema].[aspnet_Membership_CreateUser]
CREATE SYNONYM [dbo].[aspnet_Profile_SetProperties] FOR [yourschema].[aspnet_Profile_SetProperties]
CREATE SYNONYM [dbo].[aspnet_Roles_CreateRole] FOR [yourschema].[aspnet_Roles_CreateRole]
CREATE SYNONYM [dbo].[aspnet_PersonalizationAllUsers_ResetPageSettings] FOR [yourschema].[aspnet_PersonalizationAllUsers_ResetPageSettings]
CREATE SYNONYM [dbo].[aspnet_PersonalizationAllUsers_SetPageSettings] FOR [yourschema].[aspnet_PersonalizationAllUsers_SetPageSettings]
CREATE SYNONYM [dbo].[aspnet_PersonalizationAllUsers_GetPageSettings] FOR [yourschema].[aspnet_PersonalizationAllUsers_GetPageSettings]
CREATE SYNONYM [dbo].[aspnet_PersonalizationAdministration_GetCountOfState] FOR [yourschema].[aspnet_PersonalizationAdministration_GetCountOfState]
CREATE SYNONYM [dbo].[aspnet_PersonalizationAdministration_ResetSharedState] FOR [yourschema].[aspnet_PersonalizationAdministration_ResetSharedState]
CREATE SYNONYM [dbo].[aspnet_PersonalizationAdministration_ResetUserState] FOR [yourschema].[aspnet_PersonalizationAdministration_ResetUserState]
CREATE SYNONYM [dbo].[aspnet_PersonalizationPerUser_GetPageSettings] FOR [yourschema].[aspnet_PersonalizationPerUser_GetPageSettings]
CREATE SYNONYM [dbo].[aspnet_PersonalizationPerUser_ResetPageSettings] FOR [yourschema].[aspnet_PersonalizationPerUser_ResetPageSettings]
CREATE SYNONYM [dbo].[aspnet_PersonalizationPerUser_SetPageSettings] FOR [yourschema].[aspnet_PersonalizationPerUser_SetPageSettings]
CREATE SYNONYM [dbo].[aspnet_PersonalizationAdministration_DeleteAllState] FOR [yourschema].[aspnet_PersonalizationAdministration_DeleteAllState]
CREATE SYNONYM [dbo].[aspnet_PersonalizationAdministration_FindState] FOR [yourschema].[aspnet_PersonalizationAdministration_FindState]
CREATE SYNONYM [dbo].[aspnet_Profile_DeleteProfiles] FOR [yourschema].[aspnet_Profile_DeleteProfiles]
CREATE SYNONYM [dbo].[aspnet_Setup_RestorePermissions] FOR [yourschema].[aspnet_Setup_RestorePermissions]
CREATE SYNONYM [dbo].[aspnet_Setup_RemoveAllRoleMembers] FOR [yourschema].[aspnet_Setup_RemoveAllRoleMembers]
CREATE SYNONYM [dbo].[aspnet_Membership_FindUsersByName] FOR [yourschema].[aspnet_Membership_FindUsersByName]
CREATE SYNONYM [dbo].[aspnet_Membership_FindUsersByEmail] FOR [yourschema].[aspnet_Membership_FindUsersByEmail]
CREATE SYNONYM [dbo].[aspnet_AnyDataInTables] FOR [yourschema].[aspnet_AnyDataInTables]
CREATE SYNONYM [dbo].[aspnet_Applications_CreateApplication] FOR [yourschema].[aspnet_Applications_CreateApplication]
CREATE SYNONYM [dbo].[aspnet_Users_DeleteUser] FOR [yourschema].[aspnet_Users_DeleteUser]
CREATE SYNONYM [dbo].[aspnet_Users_CreateUser] FOR [yourschema].[aspnet_Users_CreateUser]
CREATE SYNONYM [dbo].[aspnet_Membership_GetUserByName] FOR [yourschema].[aspnet_Membership_GetUserByName]
CREATE SYNONYM [dbo].[aspnet_Membership_GetUserByUserId] FOR [yourschema].[aspnet_Membership_GetUserByUserId]
CREATE SYNONYM [dbo].[aspnet_Membership_GetUserByEmail] FOR [yourschema].[aspnet_Membership_GetUserByEmail]
CREATE SYNONYM [dbo].[aspnet_Membership_GetPasswordWithFormat] FOR [yourschema].[aspnet_Membership_GetPasswordWithFormat]
CREATE SYNONYM [dbo].[aspnet_Membership_UpdateUserInfo] FOR [yourschema].[aspnet_Membership_UpdateUserInfo]
CREATE SYNONYM [dbo].[aspnet_Membership_GetPassword] FOR [yourschema].[aspnet_Membership_GetPassword]
CREATE SYNONYM [dbo].[aspnet_Membership_SetPassword] FOR [yourschema].[aspnet_Membership_SetPassword]
CREATE SYNONYM [dbo].[aspnet_Membership_ResetPassword] FOR [yourschema].[aspnet_Membership_ResetPassword]
CREATE SYNONYM [dbo].[aspnet_Membership_UnlockUser] FOR [yourschema].[aspnet_Membership_UnlockUser]
CREATE SYNONYM [dbo].[aspnet_Membership_UpdateUser] FOR [yourschema].[aspnet_Membership_UpdateUser]
CREATE SYNONYM [dbo].[aspnet_Membership_ChangePasswordQuestionAndAnswer] FOR [yourschema].[aspnet_Membership_ChangePasswordQuestionAndAnswer]
CREATE SYNONYM [dbo].[aspnet_Membership_GetNumberOfUsersOnline] FOR [yourschema].[aspnet_Membership_GetNumberOfUsersOnline]
CREATE SYNONYM [dbo].[aspnet_Profile_DeleteInactiveProfiles] FOR [yourschema].[aspnet_Profile_DeleteInactiveProfiles]
CREATE SYNONYM [dbo].[aspnet_Profile_GetNumberOfInactiveProfiles] FOR [yourschema].[aspnet_Profile_GetNumberOfInactiveProfiles]
CREATE SYNONYM [dbo].[aspnet_Profile_GetProfiles] FOR [yourschema].[aspnet_Profile_GetProfiles]
CREATE SYNONYM [dbo].[aspnet_UsersInRoles_IsUserInRole] FOR [yourschema].[aspnet_UsersInRoles_IsUserInRole]
CREATE SYNONYM [dbo].[aspnet_UsersInRoles_GetRolesForUser] FOR [yourschema].[aspnet_UsersInRoles_GetRolesForUser]
CREATE SYNONYM [dbo].[aspnet_Roles_DeleteRole] FOR [yourschema].[aspnet_Roles_DeleteRole]
CREATE SYNONYM [dbo].[aspnet_Roles_RoleExists] FOR [yourschema].[aspnet_Roles_RoleExists]
CREATE SYNONYM [dbo].[aspnet_Roles_GetAllRoles] FOR [yourschema].[aspnet_Roles_GetAllRoles]
CREATE SYNONYM [dbo].[aspnet_UsersInRoles_AddUsersToRoles] FOR [yourschema].[aspnet_UsersInRoles_AddUsersToRoles]
CREATE SYNONYM [dbo].[aspnet_UsersInRoles_RemoveUsersFromRoles] FOR [yourschema].[aspnet_UsersInRoles_RemoveUsersFromRoles]
CREATE SYNONYM [dbo].[aspnet_UsersInRoles_GetUsersInRoles] FOR [yourschema].[aspnet_UsersInRoles_GetUsersInRoles]
CREATE SYNONYM [dbo].[aspnet_UsersInRoles_FindUsersInRole] FOR [yourschema].[aspnet_UsersInRoles_FindUsersInRole]
CREATE SYNONYM [dbo].[aspnet_Profile_GetProperties] FOR [yourschema].[aspnet_Profile_GetProperties]
CREATE SYNONYM [dbo].[aspnet_Paths_CreatePath] FOR [yourschema].[aspnet_Paths_CreatePath]
CREATE SYNONYM [dbo].[aspnet_WebEvent_LogEvent] FOR [yourschema].[aspnet_WebEvent_LogEvent]
CREATE SYNONYM [dbo].[aspnet_Personalization_GetApplicationId] FOR [yourschema].[aspnet_Personalization_GetApplicationId]
CREATE SYNONYM [dbo].[aspnet_Membership_GetAllUsers] FOR [yourschema].[aspnet_Membership_GetAllUsers]
person intermension    schedule 15.02.2010