Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Определение прав пользователя на строки в таблице  [new]
Timon
Member

Откуда: Dushanbe TJK
Сообщений: 2688
Всем привет.

Хотел спросить кто камими приёмами разделения прав пользователей использует. Т.е. допустим есть таблица по районам (мой рабочий пример)

CREATE TABLE [RAION] (
	[ID_RAION] [int] IDENTITY (1, 1) NOT NULL ,
	[RAION_NAME] [varchar] (20) COLLATE Cyrillic_General_CI_AS NOT NULL)
) ON [PRIMARY]

А в ней данные:

1 Первый район
2 Второй район

Select к этой таблице запрещён всем пользователям (кроме dbo и sa конечно)

Создаю VIEW

CREATE VIEW dbo.VW_Raion
AS
SELECT DISTINCT ID_RAION, RAION_NAME
FROM         dbo.RAION
WHERE     (dboRAION.ID_RAION = dbo.GET_permission(2)) OR
                      (dbo.GET_permission(1) = 1)

И даю разрешение на SELECT (вьюшке конечно) всем пользователям.

В Общем функция GET_permission определяет какой район пользователь может видеть, только 1-й или 2-й или оба сразу.

Всё велликолепно работает только мне не нравяться тормоза когда я использую VW_Raion в других запросах.

и наконец ВОПРОС
Есть ли другие приёмы разрешения доступа к строкам.
15 сен 05, 10:10    [1879394]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
Timon
Member

Откуда: Dushanbe TJK
Сообщений: 2688
Неужели ниукого такой проблемы не возникало!!!!!!!!!!!!!!

Чегото я сомневаюсь.
15 сен 05, 10:43    [1879543]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
Брюлик
Member

Откуда:
Сообщений: 690
http://vyaskn.tripod.com/row_level_security_in_sql_server_databases.htm
15 сен 05, 10:46    [1879565]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Создайте таблицу ПользователиПоРайонам (Район, имя пользователя) и делайте с ней JOIN. А в условии пишите имя пользователя = USER_NAME() (или SUSER_SNAME()). А еще лучше все на хп реализовывать.
15 сен 05, 10:48    [1879576]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
Alexander Us
Member

Откуда:
Сообщений: 1133
Vosnkalo:

prishlos sdelat column Rool (bigint). Kajdomu useru byla prisvoena binarnaia maska USerMask.

satem

Select .... from ... where Rool & UserMask <> 0

Prichem v udf eto sagnat ne poluchaetsia - tormosit.
Pri ispolsovanii odnogo stolbza bigint poluchite max 64 usera.
Dannoe reshenie bylo vybrano iskluchitelno is soobrejenii proisviditelnosti.
15 сен 05, 10:55    [1879624]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
aleks2
Guest
Alexander Us
Vosnkalo:

prishlos sdelat column Rool (bigint). Kajdomu useru byla prisvoena binarnaia maska USerMask.

satem

Select .... from ... where Rool & UserMask <> 0

Prichem v udf eto sagnat ne poluchaetsia - tormosit.
Pri ispolsovanii odnogo stolbza bigint poluchite max 64 usera.
Dannoe reshenie bylo vybrano iskluchitelno is soobrejenii proisviditelnosti.


Ну да... производительность - сканирование таблицы - это вы называете производительностью?
---------------
А... дошло - это шутка?
15 сен 05, 11:04    [1879672]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
aleks2
Guest
Timon
Всем привет.

Хотел спросить кто камими приёмами разделения прав пользователей использует. Т.е. допустим есть таблица по районам (мой рабочий пример)

CREATE TABLE [RAION] (
	[ID_RAION] [int] IDENTITY (1, 1) NOT NULL ,
	[RAION_NAME] [varchar] (20) COLLATE Cyrillic_General_CI_AS NOT NULL)
) ON [PRIMARY]

А в ней данные:

1 Первый район
2 Второй район

Select к этой таблице запрещён всем пользователям (кроме dbo и sa конечно)

Создаю VIEW

CREATE VIEW dbo.VW_Raion
AS
SELECT DISTINCT ID_RAION, RAION_NAME
FROM         dbo.RAION
WHERE     (dboRAION.ID_RAION = dbo.GET_permission(2)) OR
                      (dbo.GET_permission(1) = 1)

И даю разрешение на SELECT (вьюшке конечно) всем пользователям.

В Общем функция GET_permission определяет какой район пользователь может видеть, только 1-й или 2-й или оба сразу.

Всё велликолепно работает только мне не нравяться тормоза когда я использую VW_Raion в других запросах.

и наконец ВОПРОС
Есть ли другие приёмы разрешения доступа к строкам.


Это вполне приличное решение. Для ускорения

CREATE VIEW dbo.VW_Raion
AS
SELECT DISTINCT ID_RAION, RAION_NAME
FROM         dbo.RAION
WHERE     (dboRAION.ID_RAION = (select dbo.GET_permission(2))) OR
                      ((select dbo.GET_permission(1)) = 1)

Это позволяет не вызывать многократно dbo.GET_permission(2), которые могут быть по мнению MS SQL nondeterministic...
15 сен 05, 11:11    [1879707]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
Alexander Us
Member

Откуда:
Сообщений: 1133
aleks2

Ну да... производительность - сканирование таблицы - это вы называете производительностью?
------------
А... дошло - это шутка?


Da nasuvaiu. I eto ne shutka :(

V tablize faktov seichas 7 mln sapisei.
V tablize pokupatelei i artiklei primerno po 100.000 sapisei.
Krome togo, est eshe 7 Dimensions.
Takim obrasom nado bylo opredelit prava na primerno 300.000 sapisei spravochnika dlia 100 Userov.
A vy chto, predlojili by sosdat relationnuiu tablizu i ispolsovat jejo v join?
15 сен 05, 11:16    [1879741]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
Timon
Member

Откуда: Dushanbe TJK
Сообщений: 2688
SELECT DISTINCT ID_RAION, RAION_NAME
FROM          dbo.RAION
WHERE     (dbo.RAION.ID_RAION = (dbo.GET_permission(2))) OR 
(dbo.GET_permission(1) = 1)

Execution PLAN
StmtText                                                                                          
-------------------------------------------------------------------------------------------------
|--Filter(WHERE:([RAION].[ID_RAION]=[dbo].[GET_permission](2) OR [dbo].[GET_permission](1)=1))
|--Clustered Index Scan(OBJECT:([dbo].[RAION].[RAION_PK]))

Clustered Index Scan забирает 100% - это нормально?
15 сен 05, 11:27    [1879792]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
Timon
SELECT DISTINCT ID_RAION, RAION_NAME
FROM          dbo.RAION
WHERE     (dbo.RAION.ID_RAION = (dbo.GET_permission(2))) OR 
(dbo.GET_permission(1) = 1)

Execution PLAN
StmtText                                                                                          
-------------------------------------------------------------------------------------------------
|--Filter(WHERE:([RAION].[ID_RAION]=[dbo].[GET_permission](2) OR [dbo].[GET_permission](1)=1))
|--Clustered Index Scan(OBJECT:([dbo].[RAION].[RAION_PK]))

Clustered Index Scan забирает 100% - это нормально?

Вполне возможно, что с индексом по dbo.RAION.ID_RAION могло бы быть и получше.
15 сен 05, 11:32    [1879819]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
Timon
Member

Откуда: Dushanbe TJK
Сообщений: 2688
2 Гавриленко Сергей Алексеевич

Вы предлагаете убрать кластерный индекс и сделать обычный?
15 сен 05, 11:52    [1879919]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
Timon
Member

Откуда: Dushanbe TJK
Сообщений: 2688
Table Scan тоже берёт 100%
15 сен 05, 11:55    [1879930]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
2 Гавриленко Сергей Алексеевич

Автор просто не полный скрипт таблицы привел.
15 сен 05, 11:55    [1879933]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
2Timon

С таким OR (dbo.GET_permission(1) = 1) ничего кроме скана и не будет в принципе.
15 сен 05, 11:57    [1879943]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
tpg
2Timon

С таким OR (dbo.GET_permission(1) = 1) ничего кроме скана и не будет в принципе.

Юнионы могли бы, кстати, помочь.
15 сен 05, 12:00    [1879959]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
Timon
Member

Откуда: Dushanbe TJK
Сообщений: 2688
Гавриленко Сергей Алексеевич
tpg
2Timon

С таким OR (dbo.GET_permission(1) = 1) ничего кроме скана и не будет в принципе.

Юнионы могли бы, кстати, помочь.


Каким образом здесь можно использовать UNION, не подскажете?
15 сен 05, 12:02    [1879969]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
Timon
Гавриленко Сергей Алексеевич
tpg
2Timon

С таким OR (dbo.GET_permission(1) = 1) ничего кроме скана и не будет в принципе.

Юнионы могли бы, кстати, помочь.


Каким образом здесь можно использовать UNION, не подскажете?

Хм, недоглядел запрос ...
15 сен 05, 12:06    [1879992]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
Timon
Member

Откуда: Dushanbe TJK
Сообщений: 2688
Уважаемы все.

Select * from raion
даёт Clustered Index Scan = 100%
(это за моим компьютером)

За другим такой же запрос Clustered Index Scan = 0%

В общем я знаю почему, В FAQ-е на SQL.RU есть тема:
В плане выполнения запроса отображаются неверные значения Cost
Я это зделал на своём компутере а на соседнем не делал,

ВОПРОС : какому верить?

ps/ Я просто не в понятках.
15 сен 05, 12:13    [1880026]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Вот где точка - тому и верить.
15 сен 05, 12:14    [1880039]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
автор
ВОПРОС : какому верить?

Тому, у которого в разделителях точка стоит.
15 сен 05, 12:15    [1880042]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
Timon
Member

Откуда: Dushanbe TJK
Сообщений: 2688
ВОЙ БЛИН,
я думал у меня все запросы оптимизированны (но наблюдал тормоза в простых запросах), но когда установил . (точку), появились непонятные проценты.

Теперь наверно придётся много пересматривать ((((((((((((((((((((((((((((

VERY Hrenovo
----------

Теперь я не отстану с вопросами
Clustered Index Scan = 100% - это нормально или совсем плохо?
15 сен 05, 12:18    [1880065]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
Timon
ВОЙ БЛИН,
я думал у меня все запросы оптимизированны (но наблюдал тормоза в простых запросах), но когда установил . (точку), появились непонятные проценты.

Теперь наверно придётся много пересматривать ((((((((((((((((((((((((((((

VERY Hrenovo
----------

Теперь я не отстану с вопросами
Clustered Index Scan = 100% - это нормально или совсем плохо?

Скажем так, простое наличие этого скана может говорить о том, что все не так хорошо. Например, отсутствует индекс, который мог бы использовать оптимизатор, или оптимизатор решил его не использовать, или оптимизатор не смог его использовать.
15 сен 05, 12:29    [1880140]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
aleks2
Guest
tpg
2Timon

С таким OR (dbo.GET_permission(1) = 1) ничего кроме скана и не будет в принципе.


Оптимизатор дурак... но не настолько. Не будет скана - сам пользую подобную конструкцию.

OR ((select dbo.GET_permission(1)) = 1)
15 сен 05, 12:30    [1880146]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
aleks2
tpg
2Timon

С таким OR (dbo.GET_permission(1) = 1) ничего кроме скана и не будет в принципе.


Оптимизатор дурак... но не настолько. Не будет скана - сам пользую подобную конструкцию.

OR ((select dbo.GET_permission(1)) = 1)

Во всяком случае, условия можно поменять местами. :)
Эффект иногда бывает ... вызывающий удивление.
15 сен 05, 12:31    [1880158]     Ответить | Цитировать Сообщить модератору
 Re: Определение прав пользователя на строки в таблице  [new]
Glory
Member

Откуда:
Сообщений: 104760
Timon

Теперь я не отстану с вопросами
Clustered Index Scan = 100% - это нормально или совсем плохо?

Какой тип данных возвращает ваша dbo.GET_permission ???
15 сен 05, 12:33    [1880173]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить