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
(mapepd для входа в систему 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
.