2010-01-14 2 views
0

Можно ли фильтровать содержимое представления t-sql на основе SELECT GRANTS, назначенного ролям конечных пользователей, без генерации исключений разрешений SELECT?Разрешения для ролей Отфильтрованное представление t-sql

Если да, то как?

Псевдо:

CREATE TABLE Beer(a(x), b(y)); GRANT SELECT ON Beer to BeerOnlyRole; 
CREATE TABLE Wine(a(x), b(y)); GRANT SELECT ON Wine to WineAndBeerRole; 
GRANT SELECT ON Beer to WineAndBeerRole; 

CREATE VIEW SimpleAlcoholSearch 
(
    SELECT a AS BrandName 
      ,b AS Strength 
    FROM Beer 

    UNION 

    SELECT a AS BrandName 
      ,b AS Strength 
    FROM Wine 
) 

GRANT SELECT ON SimpleAlcoholSearch to BeerOnlyRole; 
GRANT SELECT ON SimpleAlcoholSearch to WineAndBeerRole; 

....

А.С. BeerOnlyRole: SELECT * FROM SimpleAlcoholSearch: BEER1 1% beer2 2%

А.С. WineAndBeerRole: SELECT * FROM SimpleAlcoholSearch : BEER1 1% BEER2 2% WINE1 10% WINE2 11%

Спасибо за чтение этого ...

ответ

0

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

SELECT a AS BrandName 
      ,b AS Strength 
    FROM Beer 

WHERE 1 = 

    (
     SELECT TOP 1 1 
     FROM sys.database_permissions sy_dpe 

     JOIN sys.objects sy_o ON sy_dpe.major_id = sy_o.object_id 
     JOIN sys.schemas sy_sc ON sy_o.schema_id = sy_sc.schema_id 
     JOIN sys.database_principals sy_dpr ON sy_dpe.grantee_principal_id = sy_dpr.principal_id 
     JOIN sys.database_role_members sy_drm ON sy_drm.role_principal_id = sy_dpr.principal_id 
     JOIN sys.database_principals sy_dpr2 ON sy_dpr2.principal_id = sy_drm.member_principal_id 

     WHERE sy_dpr2.name = SYSTEM_USER 
     AND sy_o.name = 'Beer' 
     AND sy_sc.name = '[n]' 
     AND sy_dpe.type = 'SL' 
     AND sy_dpe.state = 'G' 
    ) 

UNION 

.... 

Каждый получил опрятнее подход?

С благодарностью

Смежные вопросы