【问题标题】:Why do i need to have create database permissions for asp.net web app?为什么我需要为 asp.net Web 应用程序创建数据库权限?
【发布时间】:2017-06-08 07:29:24
【问题描述】:

我正在构建一个 ASP.NET、代码优先的 Web 应用程序。我正在使用公司拥有的数据库,并且对该服务器上的一个数据库中的表具有粗略权限。我不相信我有“创建数据库”权限。我在发布我的网络应用程序时遇到了问题。我可以在本地运行所有内容,但是当我在公司服务器上发布代码时,会出现如下错误:

Format of the initialization string does not conform to specification starting at index 0. 
  Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

 Exception Details: System.ArgumentException: Format of the initialization string does not conform to specification starting at index 0.

Source Error: 
 An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 
[ArgumentException: Format of the initialization string does not conform to specification starting at index 0.]
   System.Data.Common.DbConnectionOptions.GetKeyValuePair(String connectionString, Int32 currentPosition, StringBuilder buffer, Boolean useOdbcRules, String& keyname, String& keyvalue) +1742
   System.Data.Common.DbConnectionOptions.ParseInternal(Hashtable parsetable, String connectionString, Boolean buildChain, Hashtable synonyms, Boolean firstKey) +191
   System.Data.Common.DbConnectionOptions..ctor(String connectionString, Hashtable synonyms, Boolean useOdbcRules) +136
   System.Data.SqlClient.SqlConnectionString..ctor(String connectionString) +75
   System.Data.SqlClient.SqlConnectionFactory.CreateConnectionOptions(String connectionString, DbConnectionOptions previous) +35
   System.Data.ProviderBase.DbConnectionFactory.GetConnectionPoolGroup(DbConnectionPoolKey key, DbConnectionPoolGroupOptions poolOptions, DbConnectionOptions& userConnectionOptions) +241
   System.Data.SqlClient.SqlConnection.ConnectionString_Set(DbConnectionPoolKey key) +78
   System.Data.SqlClient.SqlConnection.set_ConnectionString(String value) +116
   System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch(TTarget target, Action`2 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed) +104
   System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.SetConnectionString(DbConnection connection, DbConnectionPropertyInterceptionContext`1 interceptionContext) +434
   System.Data.Entity.Internal.LazyInternalConnection.TryInitializeFromAppConfig(String name, AppConfig config) +39
   System.Data.Entity.Internal.LazyInternalConnection.Initialize() +160
   System.Data.Entity.Internal.LazyInternalConnection.get_Connection() +16
   [Project].DBContext.Context..ctor() in C:\Users\[UserName]\Documents\[FilePath]\[Project]\DBContext\Context.cs:20
   [Project].Data_Manager.DataManager..ctor() in C:\Users\[UserName]\Documents\[FilePath]\[Project]\Data_Manager\DataManager.cs:15
   [Project].Controllers.HeaderController..ctor() in C:\Users\[UserName]\Documents\[FilePath]\[Project]\Controllers\HeaderController.cs:12

这个错误让我相信我的连接字符串有问题。使用单元测试时,我收到错误:

An exception of type 'System.Data.SqlClient.SqlException' occurred in EntityFramework.dll but was not handled in user code

Additional information: CREATE DATABASE permission denied in database 'master'.

我最近更改了上下文构造函数:

public Context() : base("[server_Name].[database_name]")
{}

到:

public Context() : base("[server_Name].[full_company_server_file_path]")
{}

当我在本地运行解决方案时,也得到了“CREATE DATABASE permission denied in database 'master'”错误。

为了记录,我的连接字符串是:

<connectionStrings>
      <clear />
    <add name="[server_Name].[database_name]" providerName="System.Data.SqlClient" connectionString="Data Source=[server_Name].[full_company_server_file_path];Initial Catalog=[database_name];Persist Security Info=True;User ID=userid;Password=password;MultipleActiveResultSets=True;Application Name=EntityFramework" />
< /connectionStrings>

我的问题是:

为什么我需要创建数据库权限才能让这一切正常工作? 如果不是这种情况,为什么我会不断收到此错误? (在我的代码中我没有说创建数据库,我也不应该/不能)。

其次,关于修复我的连接字符串有什么建议吗?我从数据库 -> 属性 -> 连接字符串中得到了这个连接字符串(所以我觉得它是正确的)。

感谢所有帮助/提示/解释。

使用:

  • ASP.NET/实体框架/C#
  • Visual Studio 2015
  • SQL Server Management Studio 2014

【问题讨论】:

  • 您可以在该服务器上手动创建数据库吗?我的意思是使用提供的凭据直接登录到 SQL 管理工作室上的 sql server。
  • 我不确定是否可以,但我不认为可以。这是一家非常大的公司,我不认为会搞砸这样的事情。
  • 如果您可以创建任何测试数据库并稍后将其删除并确定您是否有权限会更好。
  • 好的 - 我尝试创建一个新数据库并得到“数据库 'master' 中的 CREATE DATABASE 权限被拒绝。(Microsoft SQL Server,错误:262)”。
  • 这意味着您有权限问题。正确的?获得数据库管理员权限后可重试

标签: asp.net sql-server database database-permissions


【解决方案1】:

除了让您的应用程序获得在数据库服务器上执行此类活动的权限之外,您无能为力,这在大型组织中不太可能发生。

对此的最佳解决方案是不要将数据库创建操作作为 Web 应用程序发布过程的一部分。

当然,组织的政策不允许应用程序以主数据库权限运行。

将数据库创建活动留给管理数据库服务器和数据库的 DBA。他们将拥有执行此类操作所需的访问权限和权限。他们将创建数据库并运行脚本以使您的数据库可供应用程序使用。

创建一个脚本,该脚本将创建整个数据库结构,包括表、视图、存储过程、函数、键、索引等,并提出票证或 RFC 或遵循在目标服务器上创建具有适当结构的数据库所需的任何过程.让您的应用程序只处理数据,而不必担心数据库的创建和更新。

这就是生产环境中的应用程序的工作方式,以及流程的实施和遵循方式,极少数例外。

【讨论】:

  • 我不会尝试在我的代码中创建数据库。我创建表,我可以在服务器中执行这些操作。我能够创建表、创建存储过程、更新表、删除表等。我已经在 SQL Server Management Studio 和代码中成功地做到了这一点 - 本地。当我尝试从已发布的开发环境访问数据库时遇到问题 - 即使只是一个 select 语句也会使代码崩溃。
  • 本地数据库服务器和企业数据库服务器不一样。错误说“创建数据库权限被拒绝”。这意味着 EF 正在尝试首先创建数据库,因为它在开发服务器上不存在。因此,您首先需要获取由 DBA 在那里创建的数据库,并为作为连接字符串一部分的用户请求架构所有者权限
  • 但安排仅适用于开发环境。对于登台和生产环境,根本不允许使用数据库所有者角色。您的应用程序将被允许仅执行数据选择、更新、删除、运行存储过程或应用程序正常运行所需的其他操作。在 stage 和 prod 环境中完全不允许架构更改 bu 应用程序。
  • 但是,我没有使用本地数据库 - 只有开发服务器数据库。我在服务器上使用现有数据库,创建了架构,并且使用 EF 在服务器 dev db 上创建了所有表。我的应用程序只要求对表进行 crud 操作。
  • 那么真正的问题是 EF 为什么要尝试创建新数据库。有什么理由改变 Context 的构造函数?您还可以分享 [server_Name].[full_company_server_file_path] 的示例值吗?
【解决方案2】:

解决方案

对于任何好奇的人,在发布(本机 Visual Studio 操作)的过程中,连接字符串被乱码:

connectionString="$(ReplacableToken_[server_name].[database_name]-Web.config Connection String_0)" 

我将发布的连接字符串编辑为我的真实连接字符串,这解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 2021-06-24
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多