配置ASP.NET应用程序服务以使用“dbo”以外的模式

时间:2010-02-15 09:47:00

标签: asp.net schema service

我想使用ASP.NET应用程序服务,但将其配置为使用不同的架构。我正在使用this URL中概述的aspnet_regsql.exe工具,该工具默认使用dbo架构创建表和存储过程。

所以我想我可以从现有的Application Objects生成数据库脚本,然后用[example]查找并替换[dbo],然后删除原始的Application Services对象并执行编辑后的脚本以获得结果I通缉。本来只是一瞬间。

但在阅读this Scott Gu博客文章时,评论部分中有人尝试过这种方法并发现它已经失败了。斯科特通过请求发送有关该问题的电子邮件回复,我认为这是对问题的确认,但我没有看到任何解决方案。

所以我正处于数据建模阶段,我真的不想在轨道上遇到很多麻烦。有没有人知道这是否已经解决,或者在'dbo'架构问题的查找和替换方法中是否仍有任何障碍?

更新

因此,在上述情况发生之前,我甚至没有“走得很远”。显然很容易配置数据库,以便所有对象使用新架构正确引用彼此但是它显示所有支持代码中都有硬连线“dbo”引用...而不是使用连接用户帐户的默认架构。

只需尝试使用VS Studio>项目| ASP.NET CONFIGURATION工具足以打破它。在使用调整后的模式更改Web配置以指向新数据库,然后转到配置工具的“安全”选项卡后,我收到错误“无法找到存储过程'dbo.aspnet_CheckSchemaVersion'”。所以看来'dbo'已经被烘焙了。:(

更新2:

所以我已经在接受的答案 中添加了SYNONYMS并且它可以正常工作 但是我必须在数据库中输入4条记录才能让它滚动。这花了整整30秒。 ;)

在此之前,我收到以下错误:

  

在   'System.Web.Security.SqlMembershipProvider'   需要数据库模式兼容   使用架构版本'1'

所以我不得不从aspnet_Applications表复制一个应用程序行。然后是aspnet_SchemaVersions表中的3行。我从默认的dbo架构安装中获得了这些。

这是aspnet_Applications记录(为了唯一性而屏蔽'xxxx' - 你必须自己创建密钥):

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

这些是aspnet_SchemaVersions记录:

common  1   True

membership  1   True

role manager    1   True

现在一切正常。如果我将来遇到任何问题,我会更新这篇文章。

2 个答案:

答案 0 :(得分:2)

在这种情况下,答案很可能在于使用Sql Server SYNONYMS,就像别名一样。本文How and why should I use SQL Server 2005 synonyms?介绍了它们。

你基本上想要:

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

您需要将上述脚本的输出复制粘贴到新的脚本窗口中并执行该操作。所以我的想法是你使用脚本来生成其他脚本命令。

如果然后执行上述脚本的输出,它将为db中的所有过程创建同义词。

所以请注意:

  1. 它假设您有一个只包含Application Services过程的数据库。如果你有自己的自定义过程,那么你必须添加一个WHERE条件来过滤仅以'aspnet_'开头的Application Services对象,即

    WHERE p.name LIKE'aspnet _%'。

  2. 此过程假设您已完成查找和替换以设置新架构。即从原始数据库生成数据库脚本,在dbo模式引用上完成查找和替换,然后删除/删除原始dbo对象,然后运行修改后的脚本以获取所需的[模式]。[对象]设置,并且然后最后使用上面的脚本。

  3. 使用SYNONYM的性能成本取决于应用程序。

  4. 听起来很麻烦,但整个过程可能需要3-4分钟。

答案 1 :(得分:1)

上面脚本的输出如下所示你可以复制粘贴它并运行查找并替换'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]