我有一个相对复杂的经纪人应用程序。
今天,在我进行了一些更改后,我开始收到错误消息:
服务器主体“sa”无法在当前安全上下文下访问数据库“XYZ”。
到错误点为止的整个场景是:
(在数据库ABC 中)
我认为触发器中的检查是导致问题的原因。
如果我手动运行更新,它工作正常。我也曾经EXECUTE AS手动运行更新,因为sa它工作正常。
其他相关事实:
sa是数据库ABC和数据库XYZ的所有者是否有某种奇怪的作用域发生,因为所有这些都在代理的上下文中运行?
更新
更多信息:
security sql-server permissions sql-server-2008-r2 service-broker
我有一个查询sys.dm_exec_requests视图的存储过程。在存储过程中,视图只返回一行,而存储过程需要查看所有行。视图上的MSDN文章说返回什么取决于用户权限:
如果用户在服务器上有 VIEW SERVER STATE 权限,用户将看到 SQL Server 实例上所有正在执行的会话;否则,用户将只能看到当前会话。
存储过程实际上是一个broker队列的激活存储过程:
CREATE QUEUE test_queue
WITH
STATUS = ON,
RETENTION = OFF ,
ACTIVATION (
STATUS = ON,
PROCEDURE_NAME = test_procedure,
MAX_QUEUE_READERS = 1,
EXECUTE AS SELF ),
POISON_MESSAGE_HANDLING (STATUS = ON)
ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
当我阅读MSDN文章时,我改变了
EXECUTE AS SELF
Run Code Online (Sandbox Code Playgroud)
到
EXECUTE AS 'dbo'
Run Code Online (Sandbox Code Playgroud)
这没有任何区别。sys.dm_exec_requests仍然会返回一行。
我也试着做
EXECUTE AS OWNER
Run Code Online (Sandbox Code Playgroud)
这也没什么区别。据我了解,存储过程所有者是谁创建的,也就是我。由于我处于系统管理员角色中,应该可以正常工作,但事实并非如此。我将不胜感激任何故障排除提示。
特别是我想知道如何列出给定用户的服务器权限,以便我可以根据文章检查它们是否包含“查看服务器状态”权限。
令人困惑的部分是我所理解的用户是在数据库级别,所以我不清楚它如何获得服务器权限。如果你能澄清这一点,那就太好了。
SQL Server 2012 中这两个“Connect SQL”权限有什么区别?

在我的 SQL Server 日志中,我显示从一个SERVER\loginname在Security > LoginsOR 中找不到的帐户 ( )成功登录到数据库Database > Security > Users。程序正在使用此登录名来执行任务(它成功完成),因此这不是安全隐患,但我终生无法弄清楚它在哪里,我需要找到它来进行调整。
还有一些注意事项:我确实记得不久前添加了这个特定的登录名,并且我必须这样做有一些特别之处,因为它不是域帐户。相反,它使用传递身份验证(应用程序和 SQL 服务器上的相同本地帐户名称和相同的密码)。我无法使用它通过 SSMS 登录。它不是组成员资格的一部分。当我SELECT从主syslogins表做 a 时它没有显示。
有人对我的脑放屁有什么想法吗?
我正在寻找有关以下场景的最佳实践的文档。
托管应用程序包含一些“全局”数据和一些“每租户”数据。“租户”不应该访问另一个租户的表,我希望在 DBMS 级别强制执行此操作(除了强制执行到应用程序级别)。
因此,作为示例,该应用程序可以向视频租赁商店提供管理系统。
店主和员工以及与租借电影的人有关的信息是全球性的。一旦客户注册,他们就无需再次注册从另一家商店租用。
商店(租户)有自己的数据库(客户列表、库存、当前预订的电影等)。因此,当店主登录应用程序时,只显示他自己的数据,我对此没有意见。
系统是否应该为每个租户/商店创建一组新表?
或者系统是否应该使用 DBMS 安全/授权...换句话说,在后端,商店 1 的库存与商店 2 的库存在同一表中,但通过 DBMS 安全性,视图只允许为谁选择该商店的行用户已登录应用程序。
我不确定我的问题是否足够清楚?
我试图解析和理解 MySQL 文档所说的何时创建触发器需要 SUPER 权限。他们说:
如果启用了二进制日志,CREATE TRIGGER 可能需要 SUPER 权限[1]
这种暗示在某些情况下它不需要 SUPER 特权。他们指的是 log_bin_trust_function_creators=1 设置,还是还有其他东西?
其次,在[2]中他们说:
... 信任不会创建将导致不安全事件写入二进制日志的存储函数。
这里究竟有什么危险?二进制日志中哪些类型的事件可能是“不安全的”,对谁来说?
[1] https://dev.mysql.com/doc/refman/5.7/en/create-trigger.html
一点背景:
在最初的开发人员离开后,我最近继承了支持和开发数据库应用程序的责任。查看应用程序,数据库似乎有几个...问题。
我该如何向管理层提出这些问题?
通常,这应该没有问题,但我有一个问题:我的 SQL 经验不到六个月,而经理和前开发人员在这个项目上工作了好几年。
我正在尝试使处于恢复挂起状态的 SQL Server 数据库联机并可访问。SQL Server 服务使用一个 Active Directory 帐户,该帐户是域管理员并且是sysadminsql server 上的成员。SQL Server 帐户应该拥有 SQL 文件夹中的权限,因为它是域管理员。但是,它不是 SQL Server 中的本地管理员。
错误消息是:
消息 5120,级别 16,状态 101,第 1 行无法打开物理文件“F:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DBName.ndf”。操作系统错误 5:“5(访问被拒绝。)”。消息 5120,级别 16,状态 9,第 1 行无法打开物理文件“F:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DBName.ndf”。操作系统错误 5:“5(访问被拒绝。)”。
尽管
alter database [DBName] set online;
Run Code Online (Sandbox Code Playgroud)
导致以下错误:
消息 945,级别 14,状态 2,第 1 行由于无法访问的文件或内存或磁盘空间不足,无法打开数据库“databs”。有关详细信息,请参阅 SQL Server 错误日志。消息 5069,级别 16,状态 1,第 1 行 ALTER DATABASE 语句失败。
你能想到解决办法吗?
我们可以配置基于证书的身份验证来连接(登录)sql 客户端吗?或使用相互身份验证(sql server 和 sql client)连接 sql 客户端的任何其他方法?
我们需要审计数据库管理员对客户数据库的访问——至少,知道他们正在访问哪个客户数据库(最好是为什么)。如果不升级到 SQL Enterprise 或安装 GreenSQL 之类的代理,是否有其他选择可供我们选择?
例如,我正在考虑某种特权脚本,它提升(sudo 风格)您访问数据库的权限,将其记录到事件日志中,然后再减少它们。
有没有办法实现这一点,可以可靠地审计?我们还应该考虑其他方法吗?
security ×10
sql-server ×6
permissions ×2
audit ×1
corruption ×1
mysql ×1
recovery ×1
ssl ×1
trigger ×1