我有两个共享相同Azure数据库的Azure移动服务(.NET后端)。假设服务“X”和“Y”。数据库由服务“X”(当它第一次运行时)创建,并创建具有模式名称“X”的表“TA”。然后我运行了服务“Y”,它在同一个数据库中创建了相同的表“TA”和“TB”,但模式名称为“Y”。
现在我想让服务“Y”使用模式“X”来确保两个服务使用相同的数据。在“TADataController”中,我将代码更改为:
protected override void Initialize(HttpControllerContext controllerContext)
{
base.Initialize(controllerContext);
// MyContext context = new MyContext(Services.Settings.Name.Replace('-', '_'));
YContext context = new YContext("X");
DomainManager = new EntityDomainManager<ADataController>(context, Request, Services);
}
同样在“YContext”类
中 protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//string schema = ServiceSettingsDictionary.GetSchemaName();
//if (!string.IsNullOrEmpty(schema))
// modelBuilder.HasDefaultSchema(schema);
modelBuilder.HasDefaultSchema("X");
}
但是当我尝试使用Query()访问“TADataController”中的数据时,我得到一个带有消息的SqlException“指定的模式名称”X“要么不存在,要么您没有权限使用它”。我怀疑权限是否会成为问题,因为两个服务都使用相同的Azure数据库帐户,而且当我的其他服务使用它时,显然存在模式!所以我无法弄清问题是什么。
我也尝试过:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
var entityConfig = modelBuilder.Entity<UserProfileData>();
entityConfig.ToTable("UserProfileDatas", "X");
}
但提出了同样的例外。 Web上有一些信息用于将数据传输到另一个模式,如果我想将数据传输到服务“Y”,这可能会有所帮助。但我想在共享数据库上使用“X”和“Y”服务。
更新: 我意识到OnModelCreating中使用的ServiceSettingsDictionary.GetSchemaName()会根据配置返回架构的名称,所以我上传了原始代码:
protected override void Initialize(HttpControllerContext controllerContext)
{
base.Initialize(controllerContext);
MyContext context = new MyContext(Services.Settings.Name.Replace('-', '_'));
DomainManager = new EntityDomainManager<ADataController>(context, Request, Services);
}
和
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
string schema = ServiceSettingsDictionary.GetSchemaName();
if (!string.IsNullOrEmpty(schema))
modelBuilder.HasDefaultSchema(schema);
}
然后在管理门户中,我使用Key = MS_TableSchema和Value = X向Configuration \ App Settings添加了一个项目。然后再次调试代码,我意识到ServiceSettingsDictionary.GetSchemaName()按我的意愿返回“X”,但是控制器再次抛出一个SqlException,消息“指定的模式名称”X“要么不存在,要么你没有权限用它。”当我使用Query()方法。
答案 0 :(得分:2)
我理解这一点 - 您希望您的两个服务在同一个数据库中访问同一组表吗?不只是使用相同的数据库,而是使用相同的表?
您可以轻松地重复使用相同的数据库,但我们将每个移动服务设置为使用单独的架构和权限,以便仅访问该架构,以便两个服务不会无意中发生干扰。
然而,听起来你希望他们访问相同的表,对吧?这意味着除了更改服务中的架构之外,还需要在DB中为移动用户设置权限以访问该架构。
您可以使用环境选项卡下的kudu站点获取用户(查找MS_TableConnectionString连接字符串):
https://<your service>.scm.azure-mobile.net/Env
您可以使用grant命令为该用户设置权限 - 您可以看到她的示例:
https://weblogs.asp.net/fredriknormen/database-migration-and-azure-mobile-service-adventure
希望这有帮助!
的Henrik
答案 1 :(得分:2)
当名为&#39; MSName&#39;的移动服务时创建了一个名为&#39; MSName&#39;的模式。在数据库中定义,并且创建的用户仅具有访问该模式的权限。这是默认连接字符串中的用户,移动服务在运行时连接到数据库时将使用该字符串。所以如果你有服务&#39; X&#39;并尝试从中访问该服务&#39; Y&#39;用户将无权使用该服务。
您可以采取一些方法来解决这个问题。一个是找到服务用户&#39; Y&#39; (使用其中一个SQL服务器管理工具)并授予其访问X&#39;的架构的权限。另一个选择是,当在移动服务Y中创建上下文时,不使用默认连接字符串(&#34; Name = MS_TableConnectionString&#34;),而是使用用户进行&#39; X&#39的连接字符串;