У меня есть настроенный и работающий сервер MSSQL 2005. Я хотел бы иметь следующие настройки:
database_one
с участием user_one
как db_owner
и
database_two
с участием user_two
как db_owner
Сложность (по крайней мере для меня) в том, что я хотел бы database_one
быть скрытым от user_two
и database_two
быть скрытым от user_one
.
Пока что я нашел VIEW ANY DATABASE
разрешение. Играя с этим, кажется, что независимо от того, как я настраивал более конкретные разрешения для пользователя, VIEW ANY DATABASE
разрешение имеет приоритет.
Если я сбегу DENY VIEW ANY DATABASE TO user_one
, подключение как user_one покажет только master
и tempdb
системные базы данных, даже если user_one настроен как db_owner для database_one.
Есть ли способ настроить разрешения, чтобы делать то, что я хочу?
Помогли бы отдельные экземпляры?
Видимость sys.databases:
Если вызывающий sys.databases не является владельцем базы данных, а база данных не является master или tempdb, минимальные разрешения, необходимые для просмотра соответствующей строки: ALTER ANY DATABASE или VIEW ANY DATABASE на уровне сервера или CREATE DATABASE в главная база данных. Базу данных, к которой подключен вызывающий абонент, всегда можно просмотреть в sys.databases.
Таким образом, видимость по умолчанию именно то, о чем вы просите: каждый пользователь может видеть master, tempdb и свою собственную базу данных. Убедитесь, что user_one - это владелец of database_one (а не просто член роли db_owner!), например:
ALTER AUTHORIZATION ON DATABASE::database_one TO user_one;
Если установка правильная (user_one является владельцем database_one, user_two является владельцем database_two) и никаких дополнительных разрешений не предоставляется тогда вы должны получать именно то, о чем просите. В частности, вам не нужно ничего ОТКАЗАТЬ, тот факт, что вы должны ОТКАЗАТЬ в разрешении, подразумевает, что с вашим тестом что-то не так (вы предоставили дополнительные, ненужные разрешения для входа в систему user_one и user_two).