SQL Server 2016 - SSMS 仅显示授予用户的数据库



我一直在网上搜索如何能够显示已分配给用户的数据库。

情况:

User1 和User2应该有权访问数据库One2III

如果将用户1 和用户 2 添加为数据库123的db_owners,它们仍可在 SSMS 上看到服务器中的所有数据库

当然,他们无权修改数据库四、五等,但他们仍然可以在 SSMS 中看到它们。

我希望他们只能看到他们直接控制的数据库。

我可以撤销User1User2的view_databases权限,但是即使它们已添加到其中,他们也看不到OneTwoIII;它们不会显示在 SSMS 中。

仅当我将一个所有者更改为用户 1 时,用户 1 才会在 SSMS 中看到它。

我的问题是我需要细分哪些用户可以看到哪个数据库,而只查看那些数据库,没有其他任何内容,并且我无法将所有者分配给超过 1 个用户。

我已经看到这是一个问题一段时间了。 它在SQL Server 2016中是否修复?

我认为您现在可以通过角色来做到这一点。 这在以前是不可能的,但现在应该在SQL 2017上可以(不幸的是,我无法自己测试它,因为我还没有MS SQL 2017)。

来自现实笔记:

数据库范围的凭据是一类新的安全对象,支持 控制、更改、引用、取得所有权和视图定义 权限。管理数据库批量操作现在可见 sys.fn_builtin_permissions。(CTP 1.0)

首先,您需要拒绝所有视图对要正确构建视图的所有数据库进行公开:DENY VIEW any DATABASE to public

DB1的整个示例:

USE DB1;
GO
DENY VIEW any DATABASE to public;
GO
-- DB role workers owned by db_owner
CREATE ROLE workers AUTHORIZATION db_owner;
GO
-- add users to the roles
ALTER ROLE workers ADD User1;
ALTER ROLE workers ADD User2;
-- granting control of the database
GRANT CONTROL ON DATABASE::<datbase_name> To workers;

编辑

注意(来自 MSDN):如果授予对登录名的CREATE DATABASEALTER ANY DATABASE权限,并且不拒绝对登录名的VIEW ANY DATABASE,则该登录名可以看到 sys.databases 中的所有行。

权限海报:

"控制服务器"权限具有对 SQL Server 或 SQL 数据库实例的所有权限。

• "控制数据库"权限对数据库具有所有权限。

• 权限并不意味着角色成员身份,角色成员身份不授予 权限。(例如,控制服务器并不意味着系统管理员固定服务器角色的成员身份。db_owner角色中的成员身份不会授予"控制数据库"权限。 但是,有时可以在角色和等效权限之间进行模拟。

• 授予对安全对象的任何权限允许对该安全对象进行查看定义。这是一个隐含的权限,不能撤销, 但可以使用拒绝视图定义语句显式拒绝它。

• SQL 数据库权限参考版本 12。

• 对象所有者可以删除它们,但他们对它们没有完全权限。

• 表上的 DENY 被列上的 GRANT 覆盖。但是,表上的后续 DENY 将删除列 GRANT。

最新更新