我正在将 SQL Server 数据库从 Azure SQL 迁移到 AWS RDS,我发现对象所有权存在一些差异。
以下是上下文情况的简要概述:
migration
角色的 db_owner
用户运行的迁移过程创建。app
登录名运行dbo
架构中创建的应用程序表bi
模式,其中包含从这些 dbo
表中选择的多个视图bi
登录映射到数据库中的 bi
用户,该用户被授予对 bi
模式的选择权限(最好仅来自 bi
模式)。问题:
bi
模式是由所有者migration
通过数据库迁移创建的dbo
表由 dbo
所有,即使他 migration
用户在该模式中创建了表 - 这可能是有道理的,因为 dbo
模式由 dbo
用户拥有,但它仍然对我来说,由同一用户在不同模式中创建的对象最终由不同用户拥有似乎很奇怪。bi
模式从视图中进行选择时,我收到一条错误,指出我还必须向底层 dbo
表授予 SELECT 权限,这似乎是由于 SQL Server 中的所有权链所致,因为该表的所有者视图和表格不同在我们的 Azure SQL 环境中,我们能够使用映射到数据库中的
dbo
用户的登录名运行迁移,以便 bi
视图和 dbo
表由同一用户拥有,我们做到了不必也向 dbo
显式授予 SELECT 权限。我尚未找到将 AWS RDS 中的登录映射到 dbo
用户的方法 - 似乎有一个已停用的 rdsa
登录映射到 dbo
,但我没有此登录的凭据。 RDS 仅提供不映射到 dbo
的主登录/用户。
在此期间,我还将
bi
用户 SELECT 权限授予 dbo
,但我想知道在解决此问题时有哪些更好的选择。有没有办法创建映射到 dbo
的登录名?我是否必须将所有应用程序表从 dbo
模式移至我可以控制所有权的另一个模式中?
只需将所有模式的所有权更改为 DBO 即可。这将恢复所有所有权链。然后授予 bi 模式的 bi 选择权限。例如
alter authorization on schema::bi to dbo
grant select on schema::bi to bi
同一用户在不同模式中创建的对象最终归不同用户所有。
默认情况下,对象始终由架构所有者拥有。将单个对象的所有权更改给其他人是可能的,但这几乎从未完成过,而且没有人会想到它。所以不要这样做。