我的第一个问题帖子:我在 Lubuntu 18.04 LTS 上运行 SQL Server 2017 CU14 开发版。
假设我有 3 个数据库masterdb, child1, child2,通过sa登录我可以看到所有 3 个数据库。
例如,是否有可能创建一个登录名mike来仅查看child1和child2数据库,而不是显示masterdb?
我已经尝试过其他方法,但只导致 1 对 1 关系,1 个登录视图 1 db(不显示其他 2 db)
任何见解将不胜感激
我的第一个问题帖子:我在 Lubuntu 18.04 LTS 上运行 SQL Server 2017 CU14 开发版。
假设我有 3 个数据库masterdb, child1, child2,通过sa登录我可以看到所有 3 个数据库。
例如,是否有可能创建一个登录名mike来仅查看child1和child2数据库,而不是显示masterdb?
我已经尝试过其他方法,但只导致 1 对 1 关系,1 个登录视图 1 db(不显示其他 2 db)
任何见解将不胜感激
如果登录的用户拥有相关数据库,则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声明中。