在SQL Server中是否可以一次登录查看多个数据库?

时间:2019-04-10 11:15:49

标签: sql-server

我的第一个问题帖子:我在Lubuntu 18.04 LTS上运行SQL Server 2017 CU14开发版。

假设我有3个数据库masterdb, child1, child2,并且以sa登录后,我可以看到所有3个数据库。

例如,是否可以创建登录名mike以仅查看child1child2数据库,而不显示masterdb

我已经尝试过其他方法,但仅导致一对一关系,1个登录视图1 db(未显示其他2 db)

任何见识都会受到赞赏

1 个答案:

答案 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中,仅显示tempdbmaster。在第二秒之后,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语句中没有出现ExampleDBSELECT