为什么我需要为asp.net Web应用程序创建数据库权限?

时间:2017-01-23 17:34:54

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

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

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>

我的问题是:

为什么我需要创建数据库权限才能使这一切正常工作? 如果不是这样的话,为什么我一直收到这个错误? (在我的代码中我没有说创建数据库,也不应该/我可以)。

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

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

使用:

  • ASP.NET / Entity Framework / C#
  • Visual Studio 2015
  • SQL Server Management Studio 2014

2 个答案:

答案 0 :(得分:0)

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

最佳解决方案是不将数据库创建操作包含在Web应用程序发布过程中。

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

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

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

生产环境中的应用程序是如何运作的,以及如何实施和遵循流程的极少数例外情况。

答案 1 :(得分:0)

<强>解

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

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

我将已发布的连接字符串编辑为我的真实连接字符串,并修复了问题。