我正在使用带分片的Azure SQL数据库(单租户方法)。因此,当应用程序连接到数据库时,它将进入Shard并创建与租户数据库的正确连接(租户由登录名标识)。 但是,在开发阶段,我们一直在使用服务器管理员凭据。 现在,与服务器管理员相比,我想创建一个权限有限得多的独立应用程序用户。 在一个非常普通的情况下,我想要拥有一个可以连接到“碎片图”并找出到任何碎片的连接字符串,但对每个碎片具有不同权限的用户。例如,某些应用程序用户可能需要能够以完全的读写权限连接到DB_1,以只读的权限连接到DB_2,而没有权限连接到DB_3。
在一个简单的情况下,我只需要一个对ShardMap和其他内部数据库没有任何更新权限,但对所有租户数据库(分片)具有正常读取/写入/执行访问权限的用户。
我正在四处搜寻,却找不到任何好的秘诀来做到这一点,什么是最佳实践等等。 如果有人可以回答我或指向文档,我将不胜感激。 谢谢你!
答案 0 :(得分:1)
在每个数据库create a role中为“应用程序用户”提供权限,并授予其运行应用程序所需的最小权限。在这里,授予Schema级别的权限是一个不错的选择,因为您不必管理对象级别的权限。
create role ApplicationUsers;
grant select, insert, update, delete, execute on schema::dbo to ApplicationUsers;
然后,如果要单个身份访问所有数据库,请使用密码create a login。然后在每个Tenant数据库中创建一个映射到该登录名的用户。
--create a server-level Login
create login AppUser with Password ='asdfAds01980(*)(*)(#&$)#@';
--add a user mapped to that login in each database
create user AppUser for login AppUser;
alter role ApplicationUsres add member AppUser;
或者在每个数据库中使用不同的密码或数据库用户将create a user映射到Azure Active Directory identity。
create user AppUser with Password ='asdfAds01980(*)(*)(#&$)#@';
alter role ApplicationUsers add member AppUser;
或
create user [tenant123user@mydomain.onmicrosoft.com] from external provider;
alter role ApplicationUsers add member [tenant123user@mydomain.onmicrosoft.com];