Как-то дали учетной записи права
на выборку из некоторых таблиц БД, учетная запись уже была в БД, но, как
оказалось, эта учетная запись уже имела выборку на все таблицы БД, но откуда
они шли из графической оболочки Management Studio не
сразу смогли вычислить – смотрел права на таблицы, на роль db_datareader и другие объекты, но как оказалось, права шли с прав на
БД, а в графическом интерфейсе Management Studio просто забыли их посмотреть, в конце концов вычислил их через функции
безопасности ms sql server-а и решил
законспектировать данный пункт, чтобы лучше запомнить.
Итак, узнать права учетной записи можно несколькими способами,
приведу их примеры:
1)В
SQL Server Management Studio правая кнопка, вкладка
«разрешение» . Это легко и просто, но
есть небольшие нюансы: нельзя узнать, имеет ли права на данный объект учетная
запись, когда она входит в роли БД\сервера или
имеются пересекающиеся права
2) Второй
способ , это через функции и процедуры ms sql server
Функция HAS_PERMS_BY_NAME предоставляет возможность получить ответ, имеет ли права учетная запись на объект, за
описанием синтаксиса пожалуйста в BOL, я лишь скажу о возвращаемом результате: 1 – пользователь
имеет запрашиваемые права на указанный объект, 0 – нет, null –ошибка.
Пример:
EXECUTE AS USER = 'test_user';
SELECT HAS_PERMS_BY_NAME(null, 'database', 'update');
Резудьтат: 0
Т.е не имеем прав на Update на БД
Кстати, в примере
запускаем проверку прав через контекст
выполнения другой учетной записи с
помощью EXECUTE
AS USER = 'test_user';
Иначе проверка бы происходила для
текущего пользователя, используйте команду revert для возврата контекста выполнения
к первоначальному пользователю, пример:
EXECUTE AS USER = 'test_user'
SELECT HAS_PERMS_BY_NAME(null,
'database', 'update');
Revert
-- используется для
возврата контекста выполнения
SELECT HAS_PERMS_BY_NAME(null, 'database', 'update');
Результат
0
1
Т.е 1 пользователь не имее прав
на обновление в БД, второй имеет права.
Вторая функция, через которую можно получить список
разрешения пользователя это функция fn_my_permissions
Синтаксис её следующий:
fn_my_permissions ( securable ,
'securable_class' )
Аргументы
securable
Имя
защищаемого объекта. Если защищаемый объект — сервер или база данных, то это
значение должно быть установлено в NULL. Аргумент securable — это скалярное
выражение типа sysname. Аргумент securable может быть многочастным именем.
'securable_class'
Имя класса
защищаемого объекта, для которого перечислены разрешения. Аргумент
securable_class является типом sysname. Аргумент securable_class принимает одно
из следующих значений: APPLICATION ROLE, ASSEMBLY, ASYMMETRIC KEY, CERTIFICATE,
CONTRACT, DATABASE, FULLTEXT CATALOG, MESSAGE TYPE, OBJECT, REMOTE SERVICE
BINDING, ROLE, ROUTE, SCHEMA, SERVICE, SYMMETRIC KEY, TYPE, USER, XML SCHEMA
COLLECTION.
Пример выполнения:
EXECUTE AS USER = 'test_user'
SELECT * FROM fn_my_permissions(NULL,
'DATABASE')
SELECT * FROM fn_my_permissions('table_1', 'object')
Revert
Результат:
entity_name subentity_name permission_name
database CONNECT
database SELECT
entity_name subentity_name permission_name
table_1
SELECT
table_1
UPDATE
table_1
INSERT
table_1
ALTER
table_1 id SELECT
table_1 val SELECT
table_1 id UPDATE
table_1 val UPDATE
Из него мы видим, что на объект БД учетная запись имеет
права на коннект и на Select,
т. е на выборку из любой таблицы данной БД.
Но, при выполнение функции на таблицу этой же БД, учетная запись
имеет еще дополнительные права.
Данные функции позволяют легко и
сразу определить , если ли права на конкретный объект, не прибегая к испоьзованию графических сред, что очень удобно.
Более подробно описано в
разделе «Функции Безопасности» BOL MS SQL Server.
P.S Использовал MS SQL 2008 R2.
Комментариев нет :
Отправить комментарий