Pau*_*ams 4 security sql-server system-tables
我们有一个配置为以用户“dbo”身份运行的 SQL 代理作业。此作业获取sys.databases中定义的与命名方案匹配的数据库列表。然后该作业执行一些动态 SQL 来清理一些旧的事务表。作业从 tempdb 开始。
代理作业在我自己的开发数据库(SQL Server 2008 R2 标准版 10.50.2500.0)上运行良好。作业正确获取数据库列表。但是,在客户系统(SQL Server 2008 R2 标准版 64 位 10.50.1600.1)上,尽管存在匹配的数据库,但作业找不到任何匹配的数据库。
在客户系统上,select * from sys.databases在查询窗口中针对 tempdb的简单运行将返回系统中的所有 10 个数据库。
使用探查器,我EXECUTE AS USER = N'dbo' WITH NO REVERT在运行此作业时看到 SQL 代理调用。我使用以下 SQL 复制了该问题:
use tempdb
-- results: tempdb, <my SQL user>, dbo
select
db_name() as [Current Database],
suser_name() as [Current Context],
user_name() as [Current User]
-- results: tempdb, 10 (which I expect)
select
db_name() as [Current Database],
count(*)
from sys.databases
execute as user = N'dbo'
-- results: tempdb, sa, dbo
select
db_name() as [Current Database],
suser_name() as [Current Context],
user_name() as [Current User]
-- results: tempdb, 2 (?!?)
select
db_name() as [Current Database],
count(*)
from sys.databases
revert
Run Code Online (Sandbox Code Playgroud)
如果我将“use tempdb”更改为“use master”,则结果是每个查询的预期 10 个数据库。
以用户 dbo 身份从 tempdb 数据库运行时,为什么 sys.databases 会返回不同的结果?为什么它use master以 dbo 用户身份返回所有数据库?
更多信息 - 如果我在 SQL Server Management Studio 中运行此脚本而不包括revert底部,我的数据库列表将缩小到此查询从 sys.databases 返回的相同的两个。
这似乎与访问权限和数据库中的特定用户有关。首先要理解的是,sys.databases在任何数据库中都只是一个视图,它公开了存在于resourcedb. 任何时候您在任何数据库中查询时,都是通过不同的视图访问同一个表。
要了解的第二件事是每个数据库都有一个dbo用户。当您使用 时execute as user = N'dbo',这意味着您dbo处于该特定数据库的上下文中。在您的特定示例中,dbo用户 inmaster和dbo用户 intempdb是两个不同的安全主体。
您所看到的只是每个委托人可以看到的内容。 dbo用户,作为每个特定数据库的所有者登录,只有查看以下数据库的权限:
master (为了查找控制信息)tempdb (为了在必要时创建临时对象)请注意,dbo用户master,因为该数据库需要看到和所有数据库的供电控制信息,有权查看服务器上的所有数据库。
| 归档时间: |
|
| 查看次数: |
1967 次 |
| 最近记录: |