我的第一个问题帖子:我在Lubuntu 18.04 LTS上运行SQL Server 2017 CU14开发版。
假设我有3个数据库masterdb, child1, child2
,并且以sa
登录后,我可以看到所有3个数据库。
例如,是否可以创建登录名mike
以仅查看child1
和child2
数据库,而不显示masterdb
?
我已经尝试过其他方法,但仅导致一对一关系,1个登录视图1 db(未显示其他2 db)
任何见识都会受到赞赏
答案 0 :(得分:0)
如果登录名的某个用户拥有相关数据库,那么VIEW ANY DATABASE
可能就是之后的状态。请看下面的例子:
USE master;
GO
CREATE LOGIN Test WITH PASSWORD = '123', CHECK_POLICY = OFF;
ALTER SERVER ROLE dbcreator ADD MEMBER Test;
DENY VIEW ANY DATABASE TO Test;
GO
EXECUTE AS LOGIN = 'Test';
GO
SELECT *
FROM sys.databases;
GO
CREATE DATABASE TestDB;
GO
SELECT *
FROM sys.databases;
REVERT;
GO
DROP DATABASE test;
DROP LOGIN TestDB;
请注意,在第一个SELECT
中,仅显示tempdb
和master
。在第二秒之后,TestDB
还显示为用户Test
(映射到登录名Test
)拥有数据库TestDB
。
请注意,user
角色的一部分db_owner
不允许他们查看数据库(或任何其他角色):
USE master;
GO
CREATE LOGIN Test WITH PASSWORD = '123', CHECK_POLICY = OFF;
ALTER SERVER ROLE dbcreator ADD MEMBER Test;
DENY VIEW ANY DATABASE TO Test;
GO
CREATE DATABASE SampleDB;
GO
USE SampleDB;
GO
CREATE USER Test FOR LOGIN Test;
ALTER ROLE db_owner ADD MEMBER Test;
GO
USE master;
GO
CREATE DATABASE ExampleDB;
GO
USE ExampleDB;
GO
CREATE USER Test FOR LOGIN Test;
ALTER ROLE db_datareader ADD MEMBER Test;
GO
USE master;
EXECUTE AS LOGIN = 'Test';
GO
SELECT *
FROM sys.databases;
GO
CREATE DATABASE TestDB;
GO
SELECT *
FROM sys.databases;
REVERT;
GO
DROP DATABASE TestDB;
DROP DATABASE SampleDB;
DROP DATABASE ExampleDB;
DROP LOGIN Test;
SampleDB
语句中没有出现ExampleDB
或SELECT
。