当我们用.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 [用户名]