Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Использование VIEW для ограничения доступа к данным. (число прочтений - 7755 )
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Использование VIEW для ограничения доступа к данным.
22. Июля 2011 :: 06:13
Печать  
Хочу для себя разобраться с вопросом ограничения доступа к данным 1С-ки, может кому-то будет тоже интересно.

Подразумевается, что 1С переведена на WIN-авторизацию.
Подробнее тут http://www.1cpp.ru/forum/YaBB.pl?num=1250146271/0

Как я это вижу:
1. Переименовываем защищаемую таблицу (SC133 ---> _SC133). Cоздаем VIEW (SC133) и закрываем доступ к самой таблице.
2. Поправляем BKEnd таким образом, что при верификации, проверяется не только существование самой таблицы, но и аналогичной VIEW, а при проверке индексов подсовывается основная таблица (не хочется полностью отключать верификацию или делать что-то сложное по рецепту с Софтпоинта).
3. При необходимости реструкторизации базы переименовываем все таблицы и убиваем VIEW.  После окончания запускаем обработку со скриптами, которые создают VIEW и переименовывают таблицы.
4. VIEW создаем по рецепту от Z1  Улыбка  ''WITH SCHEMABINDING". (поэтому их и приходится удалять при реструкторизации) - вчера обнаружил, что в этом случае сервер пропускает хинты INDEX, а значит отпадает необходимость дополнительно патчить BKEnd на предмет исправления шаблонов запросов. (по крайней мере на 2008 SQL-е, на 2000-м нужно проверить).

Всё это работает на тестовой базе c ограничение доступа к справочнику Контрагенты и 2 видам документов.
В вследующем посте хочу обсудить тексты самих VIEW....
  
Наверх
 
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Использование VIEW для ограничения доступа к данным.
Ответ #1 - 22. Июля 2011 :: 09:52
Печать  
Обьясни, пожалуста, зачем ты ты делаешь подобное ограничения доступа? Почему их не сделать средствами 1С и 1С++? Напимер через табличное поле и дерево.
Я тоже использую вьюхи, но только для того чтобы связать документ с его табличной частью и отобразить некоторые реквизиты табличной части строкой через плюсик. Ну еще для некоторых случаев.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Использование VIEW для ограничения доступа к данным.
Ответ #2 - 22. Июля 2011 :: 10:30
Печать  
zk96 писал(а) 22. Июля 2011 :: 09:52:
Обьясни, пожалуста, зачем ты ты делаешь подобное ограничения доступа? Почему их не сделать средствами 1С и 1С++? Напимер через табличное поле и дерево.
Я тоже использую вьюхи, но только для того чтобы связать документ с его табличной частью и отобразить некоторые реквизиты табличной части строкой через плюсик. Ну еще для некоторых случаев.


В данном случае задача чисто гипотетическая - чтобы разобраться.
Те, ограничения, про которые говоришь ты - они чисто визуальные, доступ до данных у любого чела все равно полный.
Представь себе ситуацию, когда в базе лежит некая инфа, которую даже не должен знать 1С-к,  например оклады сотрудников, как ты "защитишь" ее? Или есть какой-нить хитрый манагер, который может унести с собой всю базу клиентов, то, что он визуально не видит всех клиентов, не значит, что у него нет до них доступа.
  
Наверх
 
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Использование VIEW для ограничения доступа к данным.
Ответ #3 - 22. Июля 2011 :: 11:00
Печать  
Ясно.
Эксперементируй. Это интересно. Пиши о результатах. С удовольствием почитаю.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Использование VIEW для ограничения доступа к данным.
Ответ #4 - 22. Июля 2011 :: 12:45
Печать  
Я завел табличку 'rules' со столбцами ('_user', '_group') и в этой табличке прописал соответствие каким пользователям, какие группы контрагентов доступны.

Вьюшка для справочника выглядит так:

Код
Выбрать все
SELECT    *
FROM	   dbo._SC133
WHERE     (PARENTID IN
		  (SELECT     _group
		    FROM	    dbo.rules
		    WHERE (_user = SUSER_SNAME()))) OR  (ISFOLDER = 1) 



Вьюшка для таблички Шапки "Счета"
Код
Выбрать все
SELECT     *
FROM	   dbo._DH12517
WHERE     (SP12753 IN  (SELECT     ID
		    FROM	    dbo.sc133)) 


SP12753 - реквизит Справочника Контрагенты


Для Табличной части "Счета"
Код
Выбрать все
SELECT     *
FROM	   dbo._DT12517
WHERE     (IDDOC IN  (SELECT     IDDOC
		    FROM	    dbo.DH12517)) 



И для таблицы "Журналы"
Код
Выбрать все
SELECT     *
FROM	   dbo.__1SJOURN
WHERE     (IDDOCDEF <> 12517) AND (IDDOCDEF <> 321) OR
			    (IDDOCDEF = 12517) AND (IDDOC IN
				  (SELECT     IDDOC
				    FROM	    dbo.DH12517)) OR
			    (IDDOCDEF = 321) AND (IDDOC IN
				  (SELECT     IDDOC
				    FROM	    dbo.DH12517 AS DH12517_1)) 



Обычные журналы после этого начинают реально тормозить.
Журналы на ТП, в принципе работают сносно.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Использование VIEW для ограничения доступа к данным.
Ответ #5 - 22. Июля 2011 :: 12:51
Печать  
А как правильно использовать Transaction RollBack?
Я это использую в триггере, но при этом 1С вылетает с руганью.
  
Наверх
 
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Использование VIEW для ограничения доступа к данным.
Ответ #6 - 22. Июля 2011 :: 14:35
Печать  
chessman писал(а) 22. Июля 2011 :: 12:45:
...
Обычные журналы после этого начинают реально тормозить.
Журналы на ТП, в принципе работают сносно.

А ты попробуй избавиться от "select *" , напиши нужные поля. И поробуй убрать "or" , в условиях используй EXISTS, по идее будет быстрее.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Использование VIEW для ограничения доступа к данным.
Ответ #7 - 22. Июля 2011 :: 14:43
Печать  
В данном случае этого сделать нельзя, не пройдет верификация, ведь вьюшка должна полностью повторять таблицу.
На самом деле я просто сократил текст, т.к. в базе вместо * перечислены все поля,т.к. создание вью "with binding" подразумевает полное их перечисление.
  
Наверх
 
IP записан
 
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Использование VIEW для ограничения доступа к данным.
Ответ #8 - 24. Июля 2011 :: 15:23
Печать  
chessman писал(а) 22. Июля 2011 :: 06:13:
4. VIEW создаем по рецепту от Z1  Улыбка  ''WITH SCHEMABINDING". (поэтому их и приходится удалять при реструкторизации)

VIEW WITH SCHEMABINDING - вещь очень мощная, но зачем ты используешь SCHEMABINDING, т.к. в голом виде толку от нее нет (только гемор себе создаешь, написанный в скобках), а при использовании индексов  - она не работает в 1С?
Точно уже не помню всех мест, где 1С устанавливает флаги, но если ты создашь VIEW WITH SCHEMABINDING с индексом на регистр, то провести документ уже не сможешь.
  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Использование VIEW для ограничения доступа к данным.
Ответ #9 - 24. Июля 2011 :: 15:35
Печать  
chessman писал(а) 22. Июля 2011 :: 12:45:
Обычные журналы после этого начинают реально тормозить.

Конечно будут тормозить - для больших объемов данных IN использовать категорически не рекомендуют... и для малых тоже плохо.
  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Использование VIEW для ограничения доступа к данным.
Ответ #10 - 24. Июля 2011 :: 16:52
Печать  
chessman писал(а) 22. Июля 2011 :: 12:45:
Обычные журналы после этого начинают реально тормозить.

Тормоза из-за многократного вызова подзапроса с отбором по неиндексированному полю. Для того, чтобы спрятать документы от штатных выборок, достаточно отфильтровать _1sjourn, а прямые запросы и так в твоих руках. Так что отбор лучше делать по общему реквизиту с отбором - они все в _1sjourn и проиндексированы.

А чтобы не иметь проблем с реструктуризацией - оставь _1sjourn на месте, сделай view с левым именем

select *
from _1sjourn with (nolock)
where ...


и подмени имя таблицы в запросах выборки (патчингом bkend или перехватом запросов). Только не делай потом реструктуризацию под пользователем, для которого установлены ограничения.  Подмигивание
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Использование VIEW для ограничения доступа к данным.
Ответ #11 - 25. Июля 2011 :: 10:36
Печать  
AndreyM писал(а) 24. Июля 2011 :: 15:35:
chessman писал(а) 22. Июля 2011 :: 12:45:
Обычные журналы после этого начинают реально тормозить.

Конечно будут тормозить - для больших объемов данных IN использовать категорически не рекомендуют... и для малых тоже плохо.


Переделал на INNER JOIN и UNION ALL.....реально полегчало!!!
Спасибо!
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Использование VIEW для ограничения доступа к данным.
Ответ #12 - 25. Июля 2011 :: 10:41
Печать  
AndreyM писал(а) 24. Июля 2011 :: 15:23:
chessman писал(а) 22. Июля 2011 :: 06:13:
4. VIEW создаем по рецепту от Z1  Улыбка  ''WITH SCHEMABINDING". (поэтому их и приходится удалять при реструкторизации)

VIEW WITH SCHEMABINDING - вещь очень мощная, но зачем ты используешь SCHEMABINDING, т.к. в голом виде толку от нее нет (только гемор себе создаешь, написанный в скобках), а при использовании индексов  - она не работает в 1С?
Точно уже не помню всех мест, где 1С устанавливает флаги, но если ты создашь VIEW WITH SCHEMABINDING с индексом на регистр, то провести документ уже не сможешь.



Если не использовать VIEW WITH SCHEMABINDING, то конструкция подобная Спр.НайтиПоКоду() будет выдавать ошибку с дальнейшим вылетом базы или нужно патчить bkEnd, убирать хинты 'INDEX'
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Использование VIEW для ограничения доступа к данным.
Ответ #13 - 25. Июля 2011 :: 10:49
Печать  
berezdetsky писал(а) 24. Июля 2011 :: 16:52:
Тормоза из-за многократного вызова подзапроса с отбором по неиндексированному полю.

Я view переделал, стало побыстрее работать.

berezdetsky писал(а) 24. Июля 2011 :: 16:52:
Для того, чтобы спрятать документы от штатных выборок, достаточно отфильтровать _1sjourn, а прямые запросы и так в твоих руках. Так что отбор лучше делать по общему реквизиту с отбором - они все в _1sjourn и проиндексированы.

Над этим буду думать.

Спасибо!
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Использование VIEW для ограничения доступа к данным.
Ответ #14 - 25. Июля 2011 :: 10:50
Печать  
AndreyM писал(а) 24. Июля 2011 :: 15:23:
Точно уже не помню всех мест, где 1С устанавливает флаги, но если ты создашь VIEW WITH SCHEMABINDING с индексом на регистр, то провести документ уже не сможешь.


Имеется ввиду индекс у самой VIEW?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать