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

Откуда:
Сообщений: 3947
Есть таблица с секретными данными (шпионов прошу не беспокоить меня :) )

SecretData
------------------------
ID int
Secret1 varchar(100)
NotForSpy varchar(500)
ForKGB varchar(max)

есть таблица прав для юзеров на эту таблицу

SecretDataRights
---------------------------
UserID
FieldName
Read

и данные

UserID | FieldName | Read
------------------------------------
Obama | Secret1 | True
Obama | NotForSpy | False
Obama | ForKGB | False
....
Putin | Secret1 | True
Putin | NotForSpy | True
Putin | ForKGB | True

Хочется создать запрос, который выбирал бы все поля из SecretData, но при этом если у юзера нет прав на чтение данного поля - выводить NUll или еще чо...
Хочется чтоб это было и производительно

Подскажите плиз решение
17 сен 12, 00:58    [13173445]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
aleks2
Guest
По-уму - надо просто ТРИ таблицы.

Через анальное отверстие

select case (select Read from SecretDataRights where  UserID = @UserID and FieldName='Secret1') 
              when 'True' then Secret1
              else  'фигвамм' 
          end as Secret1
,
...
from SecretData sd 
17 сен 12, 06:39    [13173699]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
sp
Member

Откуда:
Сообщений: 3947
aleks2
По-уму - надо просто ТРИ таблицы.

Через анальное отверстие

select case (select Read from SecretDataRights where  UserID = @UserID and FieldName='Secret1') 
              when 'True' then Secret1
              else  'фигвамм' 
          end as Secret1
,
...
from SecretData sd 


какую третью таблицу вы имеете в виду?
17 сен 12, 12:25    [13175045]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
aleks2
Guest
sp
какую третью таблицу вы имеете в виду?

Не третью, а три

SecretData1
------------------------
ID int
Secret1 varchar(100)

SecretData2
------------------------
ID int
NotForSpy varchar(500)

SecretData3
------------------------
ID int
ForKGB varchar(max)

И пользовать штатное разграничение доступа.
17 сен 12, 15:43    [13176819]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
sp
Member

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

это зачем же мне одну сущность дробить?? эти поля я привел для примера
штатное разграничение возможно когда клиент создает сессии с sql-логинами, а если в приложении custom-аутентификация со своими ролями - приходится разграничение прав делать таким незатейливым способом через view
17 сен 12, 16:38    [13177375]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
aleks2
Guest
sp
aleks2,
а если в приложении custom-аутентификация со своими ролями - приходится разграничение прав делать таким незатейливым способом через view


Твоя поза, суть, поза страуса. Анализируй ЭТО.
17 сен 12, 17:07    [13177694]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
sp
в приложении custom-аутентификация
Да, обычно если неправильно, так сразу везде и во всём.
Вы должны создавать или колонки или строки в обоих таблицах. А так моск выворачивает.
Или в dbo.SecretDataRights поставьте колонки { UserID, Secret1, NotForSpy, ForKGB }
Или в dbo.SecretData - { ID, FieldName, Data }
Ну или VIEW с пивотом, но это только зря нагружать сервер.
SELECT	 D.ID
	,CASE WHEN R.Secret1	= 1 THEN D.Secret1	AS Secret1
	,CASE WHEN R.NotForSpy	= 1 THEN D.NotForSpy	AS NotForSpy
	,CASE WHEN R.ForKGB	= 1 THEN D.ForKGB	AS ForKGB
	,...
FROM	           dbo.vwSecretDataRights	R
	CROSS JOIN dbo.SecretData		D
WHERE	R.UserID = @UserID

PS: Разграничивать доступ можно и по колонкам.
А ащё aleks2 любитель коррелированных запросов. CASE SELECT - ужос.
17 сен 12, 17:26    [13177843]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
END забыл в CASE
17 сен 12, 17:27    [13177858]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
aleks2
Guest
MniorА
ащё aleks2 любитель коррелированных запросов. CASE SELECT - ужос.

Хде ты там коррелированный запрос увидел. Протри глаза.

Сообщение было отредактировано: 17 сен 12, 18:23
17 сен 12, 18:01    [13178139]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
sp
Member

Откуда:
Сообщений: 3947
Mnior
Да, обычно если неправильно, так сразу везде и во всём.
Вы должны создавать или колонки или строки в обоих таблицах. А так моск выворачивает.
Или в dbo.SecretDataRights поставьте колонки { UserID, Secret1, NotForSpy, ForKGB }
Или в dbo.SecretData - { ID, FieldName, Data }


дык а я как написал?
все точно так вы написали! где не так??
17 сен 12, 18:50    [13178458]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
sp
Member

Откуда:
Сообщений: 3947
Mnior,

да еще если это ASP.NET - тогда сразу все неправильно! :)
17 сен 12, 19:21    [13178550]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
qwerty112
Guest
sp
Mnior,

да еще если это ASP.NET - тогда сразу все неправильно! :)

это Delphi ! )
17 сен 12, 19:27    [13178563]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
aleks2
Хде ты там коррелированный запрос увидел
13173699
aleks2
case (select Read from SecretDataRights where  UserID = @UserID and FieldName='Secret1') WHEN
Может я не те термины употребляю?
Как называется под-запросы в SELECT части?

sp
где не так?
Tableу spкак нада 1как нада 2
dbo.SecretData{ID,Secret1,NotForSpy,ForKGB}{ID,FieldName,Data}{ID,Secret1,NotForSpy,ForKGB}
dbo.SecretDataRights{UserID,FieldName,Read}{UserID,FieldName,Read}{UserID,Secret1,NotForSpy,ForKGB}
Аврал на работе?
17 сен 12, 21:08    [13178988]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
sp
Member

Откуда:
Сообщений: 3947
Mnior,

Понял что натупил, когда уже отправил вопрос, спасибо! :)
17 сен 12, 23:07    [13179412]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Mnior
Ну или VIEW с пивотом, но это только зря нагружать сервер.
Ну конечно это легко обходится вешая индекс на VIEW.

Это я к тому что ваша схема имеет смысл.
Но всё-таки лучше создать нормально пользователей на скуле (или группы по комбинациям на крайняк) и создать для них свою отдельную VIEW.
17 сен 12, 23:52    [13179538]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
sp
Member

Откуда:
Сообщений: 3947
Mnior
Mnior
Ну или VIEW с пивотом, но это только зря нагружать сервер.
Ну конечно это легко обходится вешая индекс на VIEW.

Это я к тому что ваша схема имеет смысл.
Но всё-таки лучше создать нормально пользователей на скуле (или группы по комбинациям на крайняк) и создать для них свою отдельную VIEW.


в ASP.NET нельзя создавать соединения с конкретным юзером - там общий пул соединений с лишком дорого по времени открытие и закрытие краткосрочных именованных соединений!!
18 сен 12, 11:32    [13180897]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
aleks2
Guest
Mnior
aleks2
Хде ты там коррелированный запрос увидел
13173699
aleks2
case (select Read from SecretDataRights where  UserID = @UserID and FieldName='Secret1') WHEN
Может я не те термины употребляю?
Как называется под-запросы в SELECT части?


Коррелированными называют запросы, ЗАВИСЯЩИЕ от поля основной таблицы. Здесь же, по факту, константнoe выражение, могущее быть замененным на переменную.

Учись, студент.
18 сен 12, 12:24    [13181392]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
remi_
Member

Откуда: СПб
Сообщений: 248
Если уж речь пошла об извращениях, то для конкретного случая
declare @SecretData table (ID int, Secret1 varchar(100), NotForSpy varchar(500), ForKGB varchar(max))

declare @SecretDataRights table (UserID varchar(128), FieldName varchar(255), RR tinyint)

insert into @SecretData(ID, Secret1, NotForSpy, ForKGB) select
1,'a','aa','aaa' union all select
2,'b','bb','bbb'

Insert into @SecretDataRights (UserID, FieldName, RR) select
'Obama','Secret1',1 union all select 
'Obama','NotForSpy',0 union all select
'Obama','ForKGB',0 union all select
'Putin','Secret1',1 union all select
'Putin','NotForSpy',1 union all select
'Putin','ForKGB',1

select d.ID, Secret1=d.Secret1+a.Secret1, NotForSpy=d.NotForSpy+a.NotForSpy, ForKGB=d.ForKGB+a.ForKGB, a.UserID
from @SecretData d
cross join (
	select UserID, Secret1=char(NULLIF(Secret1,0)), NotForSpy=char(NULLIF(NotForSpy,0)), ForKGB=char(NULLIF(ForKGB,0))
	from @SecretDataRights r
	PIVOT (
		min(RR) for FieldName in (Secret1, NotForSpy, ForKGB) 
	) p
) a
18 сен 12, 12:34    [13181506]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
aleks2
Коррелированными называют запросы, ЗАВИСЯЩИЕ от поля основной таблицы. Здесь же, по факту, константнoe выражение, могущее быть замененным на переменную.
Категорически не согласен.
Константнoe выражение - это частный случай зависимости.
Внутрь подзапроса передаются значения всех полей основного запроса.
Это именно коррелированный подзапрос.
Правда, не понимаю, а что в этом плохого?
18 сен 12, 12:39    [13181559]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
aleks2
Guest
iap
Категорически не согласен.

Внутрь подзапроса передаются значения всех полей основного запроса.



С какого бодуна они туда передадуться?
18 сен 12, 12:42    [13181589]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
aleks2
iap
Категорически не согласен.

Внутрь подзапроса передаются значения всех полей основного запроса.



С какого бодуна они туда передадуться?
Кто-то другой пишет под ником aleks2, что ли?!
Ведь говорили же, зарегистрироваться надо было! Эх...
select (select sd.Secret1 from SecretDataRights where  UserID = @UserID and FieldName='Secret1') as Secret1
,
...
from SecretData sd 
Ну как, передаётся?
18 сен 12, 13:11    [13181886]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
Glory
Member

Откуда:
Сообщений: 104751
По-моему, коррелированный запрос определяет это
In queries that include a correlated subquery (also known as a repeating subquery), the subquery depends on the outer query for its values. This means that the subquery is executed repeatedly, once for each row that might be selected by the outer query.

а не видимость полей внешнего запроса.
18 сен 12, 13:15    [13181925]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Glory
По-моему, коррелированный запрос определяет это
In queries that include a correlated subquery (also known as a repeating subquery), the subquery depends on the outer query for its values. This means that the subquery is executed repeatedly, once for each row that might be selected by the outer query.

а не видимость полей внешнего запроса.
Не вижу противоречия. Ведь имеет место не просто видимость полей,
а видимость конкретных значений полей для каждой строки внешнего запроса.
18 сен 12, 13:22    [13182008]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
Glory
Member

Откуда:
Сообщений: 104751
iap
Не вижу противоречия. Ведь имеет место не просто видимость полей,
а видимость конкретных значений полей для каждой строки внешнего запроса.

Речь идет о множественном выполнении подзапроса. Для каждой выбранной строки внешнего запроса.
Здесь
select Read from SecretDataRights where UserID = @UserID and FieldName='Secret1'
не будет никакого множественного выполнения

Я даже не уверен, будет ли множественное выполнение здесь
select sd.Secret1 from SecretDataRights where UserID = @UserID and FieldName='Secret1'
18 сен 12, 13:26    [13182042]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей по условию  [new]
aleks2
Guest
iap
aleks2
пропущено...


С какого бодуна они туда передадуться?
Кто-то другой пишет под ником aleks2, что ли?!
Ведь говорили же, зарегистрироваться надо было! Эх...
select (select sd.Secret1 from SecretDataRights where  UserID = @UserID and FieldName='Secret1') as Secret1
,
...
from SecretData sd 
Ну как, передаётся?


1. Ты, ни. Все тот же. Мог бы и по стилю опознать.
2. Это в твоем примере передается. Да, в ЭТОМ варианте - коррелированный запрос.
3. А у мя ничо не передавалось.
18 сен 12, 13:31    [13182078]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить