我一直在网上搜索如何能够显示 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中修复的吗?
答案 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 DATABASE
和ALTER 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列。