SQL Server 2016 - SSMS仅显示授予用户的DB

时间:2018-03-09 00:30:01

标签: sql-server-2016

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

案例场景:

User1 & User2 应该可以访问数据库 One Two &

如果 User1 & User2 被添加为数据库 One Two &的db_owners。 三个他们仍然在SSMS服务器上看到所有数据库

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

我希望他们 ONLY 能够看到他们可以直接控制的数据库。

我可以撤消 User1 &的视图数据库权限 User2 ,但他们没有看到 One Two & 即使已加入其中;它们不会在SSMS中显示。

仅当我将一个人的所有者更改为User1时,User1才会在SSMS中看到它。

我的问题是我需要细分哪些用户看到哪个数据库只有那些数据库,而不是其他任何内容,我不能将所有者分配给多个用户。

我已经看到这已经有一段时间了。它是在SQL Server 2016中修复的吗?

1 个答案:

答案 0 :(得分:1)

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

从发行说明:

  

DATABASE SCOPED CREDENTIAL是一类新的安全,支持   控制,更改,参考,采取所有权和查看定义   权限。 ADMINISTER DATABASE BULK OPERATIONS现在可见   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中的所有行。

许可海报:

CONTROL SERVER权限对SQL Server或SQL数据库实例具有所有权限。

•CONTROL DATABASE权限拥有数据库的所有权限。

•权限并不意味着角色成员资格和角色成员资格不授予 权限。 (例如,CONTROL SERVER并不表示sysadmin固定服务器角色的成员身份.db_owner角色中的成员身份不授予CONTROL DATABASE权限。)但是,有时可以模拟角色和等效权限。

•授予对安全性的任何许可允许查看该安全的定义。这是一个隐含的权限,它不能被撤销, 但是可以使用DENY VIEW DEFINITION语句明确拒绝。

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

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

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