我正在开发一个使用ASP.NET MVC,SQL Server,Dapper的多租户应用程序,每个租户具有单个数据库和多个架构。将为租户分配一个拥有租户模式的数据库用户。我在dbo中有一组表,另一组是所有模式共享的。
说我有dbo.Tenant
和anySchema.Table1
。从我为anyschema用户设置了连接字符串的应用程序中,如果我调用select * from Table1
它,则返回的值anySchema.Table1
。如果我在存储过程中有相同的查询,则在尝试访问时会引发错误dbo.Table1
。
我为租户db用户提供了对dbo的执行访问权限,因为单个SP正在由所有租户共享 dbo.SP_Name
我如何执行以租户db用户身份登录的存储过程,并访问Table1
anyschema,以便所有租户都可以使用单个SP。
假设我们在数据库中有两个用户,tenant1
并且tenant2
有他们自己的模式(也称为tenant1
和tenant2
)。
我们Contacts
为每个租户创建一个表,因此我们有tenant1.Contacts
and tenant2.Contacts
。
在我们的应用程序中,我们使用Dapper执行以下SQL。我们使用的是租户特定的连接字符串,该字符串使用了租户的SQL Server登录详细信息。
select * from Contacts
由于我们未在SQL中指定架构,因此可以从执行SQL的用户的默认架构中推断出该架构。因此,tenant1
它将进行查询,tenant1.Contacts
并将tenant2
对其进行查询tenant2.Contacts
。
现在,我们将在dbo
执行相同查询的架构中创建一个存储过程:
CREATE PROCEDURE GetContacts
AS
BEGIN
select * from Contacts
END
GO
请注意,我尚未在存储过程的SQL中指定架构。
当我们从应用程序执行存储过程时,仍可以从当前用户推断存储过程的模式,但是SP中的SQL会从SP的模式中推断模式。因此,如果SP属于dbo
架构,它将对dbo.Contacts
表执行查询。
这就是您所处的情况。您已经在dbo
架构中创建了一个存储过程,并期望它对租户的默认架构执行SQL 。
您有几种选择
tenant1.SP_Name
,tenant2.SP_Name
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句