我一直在网上搜索如何能够仅显示已分配给用户的数据库。
情况:
User1 和User2应该有权访问数据库One、2和III。
如果将用户1 和用户 2 添加为数据库1、2和3的db_owners,它们仍可在 SSMS 上看到服务器中的所有数据库。
当然,他们无权修改数据库四、五等,但他们仍然可以在 SSMS 中看到它们。
我希望他们只能看到他们直接控制的数据库。
我可以撤销User1和User2的view_databases权限,但是即使它们已添加到其中,他们也看不到One、Two和III;它们不会显示在 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 DATABASE
和ALTER ANY DATABASE
权限,并且不拒绝对登录名的VIEW ANY DATABASE
,则该登录名可以看到 sys.databases 中的所有行。
权限海报:
"控制服务器"权限具有对 SQL Server 或 SQL 数据库实例的所有权限。
• "控制数据库"权限对数据库具有所有权限。
• 权限并不意味着角色成员身份,角色成员身份不授予 权限。(例如,控制服务器并不意味着系统管理员固定服务器角色的成员身份。db_owner角色中的成员身份不会授予"控制数据库"权限。 但是,有时可以在角色和等效权限之间进行模拟。
• 授予对安全对象的任何权限允许对该安全对象进行查看定义。这是一个隐含的权限,不能撤销, 但可以使用拒绝视图定义语句显式拒绝它。
• SQL 数据库权限参考版本 12。
• 对象所有者可以删除它们,但他们对它们没有完全权限。
• 表上的 DENY 被列上的 GRANT 覆盖。但是,表上的后续 DENY 将删除列 GRANT。