【问题标题】:Entity Framework Core 7.0.2 "The database user has not been granted 'VIEW DEFINITION' rights"Entity Framework Core 7.0.2 \“数据库用户未被授予\'VIEW DEFINITION\'权限\”
【发布时间】:2023-01-30 21:34:52
【问题描述】:

我正在使用 dotnet ef dbcontext scaffold 命令创建我的数据库上下文。自从将工具链更新到 v7.0.2 后,我在输出中收到此警告:

Build started...
Build succeeded.
The database user has not been granted 'VIEW DEFINITION' rights. Scaffolding requires these rights to construct the Entity Framework model correctly. Without these rights, parts of the scaffolded model may be missing, resulting in incorrect interactions between Entity Framework and the database at runtime.

数据库用户在db_owner角色中,但另外我已经针对Master数据库手动执行

grant view any definition to [dbusername]

警告消息仍然存在。有人可以帮忙吗?

【问题讨论】:

  • db_owner 角色成员身份应该足够了,除非权限被明确拒绝。当以 dbusername 登录时,尝试通过在用户数据库的上下文中运行 SELECT HAS_PERMS_BY_NAME(NULL,NULL,'VIEW ANY DEFINITION'); 来验证权限。

标签: sql-server .net-core entity-framework-core


【解决方案1】:

从技术上讲,用户不需要查看定义来查看元数据。通常,表的元数据可见性授予对表具有任何其他权限的用户。见Metadata Visibility Configuration

VIEW DEFINITION 权限充当更改此行为的重写,将元数据访问权限授予本来可以拥有它的用户,或者拒绝它本来可以拥有它的用户。

因此检查 VIEW DEFINITION 与检查用户是否可以看到元数据不同。您可以首先检查适用的 DENY of VIEW DEFINITION 的授权,如果用户不受 DENY 约束并且对表或其架构或数据库具有 SELECT,则该用户将具有元数据可见性。

select state_desc,
       permission_name,
       user_name(grantee_principal_id) grantee, 
       case when class = 0 then 'DATABASE'
            when class = 1 then  concat(quotename(schema_name(o.schema_id)),'.',quotename(object_name(o.object_id)))
        end target
from sys.database_permissions p
left join sys.objects o
  on o.object_id = p.major_id 
--where state = 'D'

【讨论】:

  • HAS_PERMS_BY_NAME 应该有用,我想?
  • 没有 DENY,并且存在适当的 VIEW DEFINITION 授权。我不认为这是一个 SQL Server 问题,更多的是 EF 的问题。
  • @ErikEJ HAS_PERMS_BY_NAME 没有帮助,因为很少直接授予它 VIEW DEFINITION。它不会显示您是否因为拥有 SELECT 而拥有 VIEW DEFINITION,这是最常见的情况。
  • 然后 EF 作为另一个用户连接。
  • @DavidBrowne-Microsoft 知道了,但是根据文档 has_perms_by_name 不应该关心
猜你喜欢
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 2013-03-13
  • 2016-03-13
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
相关资源
最近更新 更多