使用DBContext在服务器上跨连接访问数据库时:服务器主体 "xxx" 无法在当前安全上下文下访问数据库 "db_xxx"的问题

当我们用.net 的System.Data中的DBContext去访问数据库时,这个上下文是基于一定的数据库连接的,当这个连接字符串中使用的是某个数据库A的登录名及数据库名A,而我们在查询过程中使用查询语句或者数据库A中的存储过程访问该服务器上B数据库中的内容时,会出现类似如下错误:

服务器主体 "xxx" 无法在当前安全上下文下访问数据库 "db_xxx_com"

TRUSTWORTHY 数据库属性用于指明 SQL Server 实例是否信任该数据库以及其中的内容。默认情况下,此设置为 OFF,但是可以使用 ALTER DATABASE 语句将其设置为 ON。
必须是 sysadmin 固定服务器角色的成员才能设置此选项。

此属性可用于减少附加数据库所带来的某些隐患,该数据库包含下列对象之一:

1、带有 EXTERNAL_ACCESS 或 UNSAFE 权限设置的有害程序集。有关详细信息,请参阅 CLR 集成安全性。
2、所定义的、作为高特权用户执行的有害模块。有关详细信息,请参阅使用 EXECUTE AS 扩展数据库模拟。

这两种情况均要求具有特定程度的权限,并且在已附加到 SQL Server 实例的数据库的上下文中使用这两种情况时,应采取相应的机制保护这两种情况。但是,如果数据库脱机,则对数据库文件具有访问权限的用户可能会将其附加到其选择的 SQL Server 实例,并将有害内容添加到数据库中。在 SQL Server 2005 中分离和附加数据库时,将对限制访问数据库文件的数据和日志文件设置某些权限。有关详细信息,请参阅保护数据和日志文件的安全。

因为无法立即信任附加到 SQL Server 实例的数据库,所以不允许数据库访问超出数据库范围的资源,直到数据库已显式标记为可信。此外,旨在访问数据库以外资源的模块和带有 EXTERNAL_ACCESS 或 UNSAFE 权限设置的程序集还需要其他条件才能成功运行。



于是在网上找了一下资料,发现是因为trustworthy数据库属性用于指明 SQL Server 实例是否信任该数据库以及其中的内容。默认情况下,此设置为 OFF,但是可以使用 ALTER DATABASE 语句将其设置为 ON。

查看看到哪些数据库开了trustworthy属性,命令如下:
SELECT name, database_id, is_trustworthy_on FROM sys.databases,默认就msdb开的有。

要打开数据库trustworthy属性,命令如下:
ALTER DATABASE 数据库名 SET TRUSTWORTHY ON

授权用户访问,命令如下:

ALTER AUTHORIZATION ON DATABASE::数据库名 TO [用户名]


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值