-1

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

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

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

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

任何见解将不胜感激

4

1 回答 1

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;

既不SampleDBExampleDB从未出现在SELECT声明中。

于 2019-04-10T11:48:12.363 回答