Когда sys.database_permissions будет содержать строку с state = 'R'? - PullRequest
4 голосов
/ 05 января 2012

В документации MSDN для sys.database_permissions говорится, что столбец состояния может быть 'G', 'D', 'R' или 'W'.Значение 'R' имеет описание 'REVOKE', что делает его звучащим так, будто строка с этим значением будет соответствовать аннулированному разрешению.Однако, как я могу судить по документам для REVOKE, отзыв разрешения полностью удаляет его, так что я ожидаю, что просто удалите строку из sys.database_permissions.Это то, что произошло, когда я проверил предоставление и затем отозвал разрешение;после GRANT разрешение появляется в этом представлении, а после REVOKE оно исчезает.

Мой вопрос: при каких обстоятельствах это представление будет содержать строки с состоянием, установленным в 'R'?Я спрашиваю об этом, потому что я не уверен, нужно ли мне обрабатывать строки 'R' при рассмотрении этого представления в коде.

Я могу придумать несколько потенциальных сценариев, где это может произойти, но ненайдено любое подтверждение:

  • Могут появиться строки 'R', если вы предоставили некоторое общее разрешение, а затем отменили более детальное разрешение, которое подразумевалось в общем разрешении (гранулярное разрешение будет отображаться как 'R').Пока я не нашел таких разрешений.
  • Строки 'R' могут появиться очень кратко, пока SQL обрабатывает команду REVOKE, и тогда вся строка исчезает.Я не наблюдал этого, но, по-видимому, есть только очень небольшое окно времени, когда оно появилось бы.

Ответы [ 3 ]

3 голосов
/ 20 мая 2015

Для объектов, которые могут иметь разрешения для столбцов, таких как таблицы или представления, наличие разрешений для объектов DENY или GRANT требует REVOKE для сохранения разрешений для столбцов.Ниже приведен рабочий пример, протестированный на SQL Server 2008, который демонстрирует, когда запись с состоянием R может существовать в sys.database_permissions.Если порядок операторов GRANT и REVOKE поменялся местами, запись с состоянием R не сохраняется.

https://gist.github.com/mches/d2282946fbe7f50a708b

CREATE USER RevokeTestUser WITHOUT LOGIN;

REVOKE CONNECT TO RevokeTestUser AS dbo;

CREATE TABLE dbo.RevokeTest (
     col int NOT NULL
);

GRANT SELECT ON dbo.RevokeTest TO RevokeTestUser AS dbo;
REVOKE SELECT ON dbo.RevokeTest (col) TO RevokeTestUser AS dbo;

SELECT *
FROM sys.database_permissions
WHERE grantee_principal_id = DATABASE_PRINCIPAL_ID(N'RevokeTestUser');

DROP USER RevokeTestUser;

DROP TABLE dbo.RevokeTest;

Это результатыSELECT оператора:

class   class_desc         major_id     minor_id    grantee_principal_id   grantor_principal_id   type   permission_name   state   state_desc
1       OBJECT_OR_COLUMN   1081939822   0           31                     1                      SL     SELECT            G       GRANT
1       OBJECT_OR_COLUMN   1081939822   1           31                     1                      SL     SELECT            R       REVOKE
1 голос
/ 20 августа 2012

Как ответил Джек Ричинс в Твиттере (спасибо @Remus Rusanu за переадресацию):

Я полагаю, что это происходит с разрешениями на уровне столбцов, которые противоречат правилам таблицы или представления.

Я проверил это, и он прав.

0 голосов
/ 19 апреля 2012

Да, возможно, в таблицах sys.database_permissions есть строка с состоянием R. R означает отозвать, и она будет там в столбце состояния таблицы.

Мы также можем иметь D (Deny), G (Grant), W (опция Grant with Grant) вместе с R.

Тип этого столбца состояния будет char (1)

см. Ссылку ниже для лучшего понимания.

http://msdn.microsoft.com/en-us/library/ms188367.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...