Вход | Регистрация

1С:Предприятие ::

Метки: 

Соединения с основной таблицей в RLS

Я
   fisher
 
25.12.12 - 17:23
Встречал в типовых RLS сразу соединение основной таблицы со справочником групп пользователей. Т.е. ежели пользователь входит в две группы и в обеих у него есть права на запись основной таблицы, то...
Короче, не совсем понятно, как платформа рулит ситуацию, когда RLS пытается "размножить" записи основной таблицы. Похоже игнорирует инсинуации. Но это вообще документированный случай?
 
 
   AversDik2
 
1 - 25.12.12 - 17:28
RLS проверять Результат.Пустой()  или нет
   fisher
 
2 - 25.12.12 - 17:34
Это документировано где-то? Просто интересно.
Если смело опираться на эту фишку, то можно более эффективные RLS писать.
   Axel2009
 
3 - 25.12.12 - 17:46
(2) дублей не будет
exec sp_executesql N'SELECT
CASE WHEN (EXISTS(SELECT
1
FROM (SELECT 1 AS SDBL_DUMMY) SDBL_DUAL
LEFT OUTER JOIN (SELECT DISTINCT
0x01 AS SDBL_RLS_SIGNAL_,
T3._Reference68_IDRRef AS Q_001_F_000RRef
FROM _Reference68_VT1656 T3 WITH(REPEATABLEREAD)
WHERE (T3._Fld1658RRef = 0xB0EE00304878481411DFB7135024B9D3)) T2
ON 1=1
WHERE ((T1._Folder = 0x00) OR ((NOT ((T2.Q_001_F_000RRef IS NULL))) AND (NOT ((EXISTS(SELECT
1.0 AS Q_002_F_000_
FROM _InfoRg18005 T4 WITH(SERIALIZABLE)
LEFT OUTER JOIN _InfoRg18069 T5 WITH(SERIALIZABLE)
ON ((((T5._Fld18070_TYPE = 0x08 AND T5._Fld18070_RTRef = 0x0000003E AND T5._Fld18070_RRRef = ISNULL(T1._Fld1931RRef,0x00000000000000000000000000000000)) AND (T5._Fld18071RRef = T4._Fld18007RRef)) AND (T5._Fld18072RRef = 0x945EE1C629CC683A48F06881D44A773A)) AND (T5._Fld18073_TYPE = CASE WHEN T2.Q_001_F_000RRef IS NOT NULL THEN 0x08 END AND T5._Fld18073_RTRef = CASE WHEN T2.Q_001_F_000RRef IS NOT NULL THEN 0x00000044 END AND T5._Fld18073_RRRef = T2.Q_001_F_000RRef))
WHERE (T4._Fld18006RRef = T2.Q_001_F_000RRef) AND (T4._Fld18007RRef = 0xAC3489582A1C66674D560056193029AE) AND T5._Fld18070_TYPE IS NULL AND T5._Fld18070_RTRef IS NULL AND T5._Fld18070_RRRef IS NULL)))))))) THEN 0x01 ELSE 0x00 END,
T1._IDRRef,
T1._Version,
T1._Marked,
T1._IsMetadata,
T1._ParentIDRRef,
T1._Folder,
T1._Code,
T1._Description,
T1._Fld1909,
T1._Fld1910,
T1._Fld1911,
T1._Fld1912RRef,
T1._Fld1913RRef,
T1._Fld1914,
T1._Fld1915,
T1._Fld1916,
T1._Fld1917,
T1._Fld1918RRef,
T1._Fld1919RRef,
T1._Fld1920RRef,
T1._Fld1921RRef,
T1._Fld1922RRef,
T1._Fld1923,
T1._Fld1924,
T1._Fld1925,
T1._Fld1926,
T1._Fld1927RRef,
T1._Fld1928,
T1._Fld1929RRef,
T1._Fld1930RRef,
T1._Fld1931RRef,
T1._Fld23280,
T1._Fld23281RRef,
T1._Fld23282RRef,
T1._Fld23485,
T1._Fld23584,
T1._Fld24222,
T1._Fld24809,
T1._Fld24810,
T1._Fld24811,
T1._Fld24812,
T1._Fld25191,
T1._Fld25292,
T1._Fld25351,
T1._Fld25544RRef,
T1._Fld25806RRef,
T1._Fld25821RRef,
T1._Fld25822RRef,
T1._Fld26311,
T1._Fld26403,
T1._Fld26438,
T1._Fld26748RRef,
T1._Fld26888,
T1._Fld26999,
T1._Fld27009,
T1._Fld27109,
T1._Fld27167,
T1._Fld27576RRef,
T1._Fld27628RRef,
T1._Fld27655,
T1._Fld27777,
0 AS SDBL_IDENTITY
FROM _Reference115 T1 WITH(REPEATABLEREAD)
WHERE T1._IDRRef = P1',N'P1 varbinary(16)',0x896D0050569570B311DF86F6ECA77536
   fisher
 
4 - 25.12.12 - 17:56
Гы! Фиг бы догадался, что именно так реализовано :)
   fisher
 
5 - 25.12.12 - 17:57
Спасибо.
   Axel2009
 
6 - 25.12.12 - 17:59
(5) да я тоже не догадывался... не самый быстрый способ избрали
   fisher
 
7 - 25.12.12 - 18:00
Хотя стоп. Я правильно понял, что сервер приложений получает всю выборку? Просто с признаком есть право или нет?
А нафига так сделано? Зачем ему лишние записи?
   fisher
 
8 - 25.12.12 - 18:04
И исходя из этого неясно, как реализуются для разных полей разные ограничения...
Похоже, это профайлинг просто попытки открытия документа?
   Axel2009
 
9 - 25.12.12 - 18:05
(7) мне лениво было делать выборку разрешенные. я сделал открытие списка контрагентов. вот эту хрень он посылает серверу=) нафига так сделано я хз.
но вполне возможно, что он же тебе потом щелкнет по носу, если ты попытаешься прочитать данные, к которым нет доступа...
   Axel2009
 
10 - 25.12.12 - 18:05
(8) надо затестить. завтра попробую =) напишу
 
 Рекламное место пустует
   fisher
 
11 - 25.12.12 - 18:07
(9) Да, точно - справочника. Если списка - тогда непонятно, почему запрос на конкретный элемент...
   Axel2009
 
12 - 25.12.12 - 18:15
(11) хыхы, таких запросов было 3 =) я проскролил вниз список
   Axel2009
 
13 - 25.12.12 - 18:16
второй
exec sp_executesql N'SELECT
0x01,
T6._LineNo1933,
T6._Fld1934RRef,
T6._Fld1935RRef,
0 AS SDBL_IDENTITY
FROM _Reference115_VT1932 T6 WITH(REPEATABLEREAD)
INNER JOIN _Reference115 T7 WITH(REPEATABLEREAD)
ON T7._IDRRef = T6._Reference115_IDRRef
WHERE T7._IDRRef = P1
ORDER BY 5 ASC, T6._LineNo1933',N'P1 varbinary(16)',0x896D0050569570B311DF86F6ECA77536

третий
exec sp_executesql N'SELECT
0x01,
T8._LineNo1937,
T8._Fld1938RRef,
0 AS SDBL_IDENTITY
FROM _Reference115_VT1936 T8 WITH(REPEATABLEREAD)
INNER JOIN _Reference115 T9 WITH(REPEATABLEREAD)
ON T9._IDRRef = T8._Reference115_IDRRef
WHERE T9._IDRRef = P1
ORDER BY 4 ASC, T8._LineNo1937',N'P1 varbinary(16)',0x896D0050569570B311DF86F6ECA77536
   Axel2009
 
14 - 25.12.12 - 18:16
хотя туплю =) это отображение строки
   Axel2009
 
15 - 26.12.12 - 13:35
(8) в общем если запрос с РАЗРЕШЕННЫЕ, тогда следующий запрос
exec sp_executesql N'SELECT
T1._IDRRef,
T1._Fld1917
FROM _Reference115 T1 WITH(NOLOCK)
WHERE (EXISTS(SELECT
1
FROM (SELECT 1 AS SDBL_DUMMY) SDBL_DUAL
LEFT OUTER JOIN (SELECT DISTINCT
T3._Reference68_IDRRef AS Q_001_F_000RRef
FROM _Reference68_VT1656 T3 WITH(NOLOCK)
WHERE (T3._Fld1658RRef = P1)) T2
ON 1=1
WHERE ((T1._Folder = @P2) OR ((NOT ((T2.Q_001_F_000RRef IS NULL))) AND (NOT ((EXISTS(SELECT
@P3 AS Q_002_F_000_
FROM _InfoRg18005 T4 WITH(NOLOCK)
LEFT OUTER JOIN _InfoRg18069 T5 WITH(NOLOCK)
ON ((((T5._Fld18070_TYPE = @P4 AND T5._Fld18070_RTRef = @P5 AND T5._Fld18070_RRRef = ISNULL(T1._Fld1931RRef,@P6)) AND (T5._Fld18071RRef = T4._Fld18007RRef)) AND (T5._Fld18072RRef = @P7)) AND (T5._Fld18073_TYPE = CASE WHEN T2.Q_001_F_000RRef IS NOT NULL THEN @P4 END AND T5._Fld18073_RTRef = CASE WHEN T2.Q_001_F_000RRef IS NOT NULL THEN @P8 END AND T5._Fld18073_RRRef = T2.Q_001_F_000RRef))
WHERE (T4._Fld18006RRef = T2.Q_001_F_000RRef) AND (T4._Fld18007RRef = @P9) AND T5._Fld18070_TYPE IS NULL AND T5._Fld18070_RTRef IS NULL AND T5._Fld18070_RRRef IS NULL))))))))', N'P1 varbinary(16),@P2 varbinary(1),@P3 numeric(1,0),@P4 varbinary(1),@P5 varbinary(4),@P6 varbinary(16),@P7 varbinary(16),@P8 varbinary(4),@P9 varbinary(16)', 0x952C00221955602611E096594C3181ED, 0x00, 1, 0x08, 0x0000003E, 0x00000000000000000000000000000000, 0x945EE1C629CC683A48F06881D44A773A, 0x00000044, 0xAC3489582A1C66674D560056193029AE

если без разрешенные, тогда 
exec sp_executesql N'SELECT
CASE WHEN (EXISTS(SELECT
1
FROM (SELECT 1 AS SDBL_DUMMY) SDBL_DUAL
LEFT OUTER JOIN (SELECT DISTINCT
P1 AS SDBL_RLS_SIGNAL_,
T3._Reference68_IDRRef AS Q_001_F_000RRef
FROM _Reference68_VT1656 T3 WITH(NOLOCK)
WHERE (T3._Fld1658RRef = @P2)) T2
ON 1=1
WHERE ((T1._Folder = @P3) OR ((NOT ((T2.Q_001_F_000RRef IS NULL))) AND (NOT ((EXISTS(SELECT
@P4 AS Q_002_F_000_
FROM _InfoRg18005 T4 WITH(NOLOCK)
LEFT OUTER JOIN _InfoRg18069 T5 WITH(NOLOCK)
ON ((((T5._Fld18070_TYPE = @P5 AND T5._Fld18070_RTRef = @P6 AND T5._Fld18070_RRRef = ISNULL(T1._Fld1931RRef,@P7)) AND (T5._Fld18071RRef = T4._Fld18007RRef)) AND (T5._Fld18072RRef = @P8)) AND (T5._Fld18073_TYPE = CASE WHEN T2.Q_001_F_000RRef IS NOT NULL THEN @P5 END AND T5._Fld18073_RTRef = CASE WHEN T2.Q_001_F_000RRef IS NOT NULL THEN @P9 END AND T5._Fld18073_RRRef = T2.Q_001_F_000RRef))
WHERE (T4._Fld18006RRef = T2.Q_001_F_000RRef) AND (T4._Fld18007RRef = P10) AND T5._Fld18070_TYPE IS NULL AND T5._Fld18070_RTRef IS NULL AND T5._Fld18070_RRRef IS NULL)))))))) THEN P1 ELSE @P3 END,
T1._IDRRef,
T1._Fld1917
FROM _Reference115 T1 WITH(NOLOCK)', N'P1 varbinary(1),@P2 varbinary(16),@P3 varbinary(1),@P4 numeric(1,0),@P5 varbinary(1),@P6 varbinary(4),@P7 varbinary(16),@P8 varbinary(16),@P9 varbinary(4),P10 varbinary(16)', 0x01, 0x952C00221955602611E096594C3181ED, 0x00, 1, 0x08, 0x0000003E, 0x00000000000000000000000000000000, 0x945EE1C629CC683A48F06881D44A773A, 0x00000044, 0xAC3489582A1C66674D560056193029AE
   Axel2009
 
16 - 26.12.12 - 13:38
(15) это я выбираю поле, которое участвует в ограничении
   Axel2009
 
17 - 26.12.12 - 13:42
(16)+ добавил на отдельное поле ограничение с условием НЕ. попробовал выбрать 2 поля, на которые действует разное ограничение.
собственно говоря как и ожидалось, добавилась через "И" другое ограничение
exec sp_executesql N'SELECT
T1._IDRRef,
T1._Fld1916,
T1._Fld1917
FROM _Reference115 T1 WITH(NOLOCK)
WHERE (EXISTS(SELECT
1
FROM (SELECT 1 AS SDBL_DUMMY) SDBL_DUAL
LEFT OUTER JOIN (SELECT DISTINCT
T3._Reference68_IDRRef AS Q_001_F_000RRef
FROM _Reference68_VT1656 T3 WITH(NOLOCK)
WHERE (T3._Fld1658RRef = P1)) T2
ON 1=1
WHERE ((T1._Folder = @P2) OR ((NOT ((T2.Q_001_F_000RRef IS NULL))) AND (NOT ((EXISTS(SELECT
@P3 AS Q_002_F_000_
FROM _InfoRg18005 T4 WITH(NOLOCK)
LEFT OUTER JOIN _InfoRg18069 T5 WITH(NOLOCK)
ON ((((T5._Fld18070_TYPE = @P4 AND T5._Fld18070_RTRef = @P5 AND T5._Fld18070_RRRef = ISNULL(T1._Fld1931RRef,@P6)) AND (T5._Fld18071RRef = T4._Fld18007RRef)) AND (T5._Fld18072RRef = @P7)) AND (T5._Fld18073_TYPE = CASE WHEN T2.Q_001_F_000RRef IS NOT NULL THEN @P4 END AND T5._Fld18073_RTRef = CASE WHEN T2.Q_001_F_000RRef IS NOT NULL THEN @P8 END AND T5._Fld18073_RRRef = T2.Q_001_F_000RRef))
WHERE (T4._Fld18006RRef = T2.Q_001_F_000RRef) AND (T4._Fld18007RRef = @P9) AND T5._Fld18070_TYPE IS NULL AND T5._Fld18070_RTRef IS NULL AND T5._Fld18070_RRRef IS NULL))))))) AND EXISTS(SELECT
1
FROM (SELECT 1 AS SDBL_DUMMY) SDBL_DUAL
LEFT OUTER JOIN (SELECT DISTINCT
T7._Reference68_IDRRef AS Q_001_F_000RRef
FROM _Reference68_VT1656 T7 WITH(NOLOCK)
WHERE (T7._Fld1658RRef = P1)) T6
ON 1=1
WHERE (NOT ((((T1._Folder = @P2) OR ((NOT ((T6.Q_001_F_000RRef IS NULL))) AND (NOT ((EXISTS(SELECT
@P3 AS Q_002_F_000_
FROM _InfoRg18005 T8 WITH(NOLOCK)
LEFT OUTER JOIN _InfoRg18069 T9 WITH(NOLOCK)
ON ((((T9._Fld18070_TYPE = @P4 AND T9._Fld18070_RTRef = @P5 AND T9._Fld18070_RRRef = ISNULL(T1._Fld1931RRef,@P6)) AND (T9._Fld18071RRef = T8._Fld18007RRef)) AND (T9._Fld18072RRef = @P7)) AND (T9._Fld18073_TYPE = CASE WHEN T6.Q_001_F_000RRef IS NOT NULL THEN @P4 END AND T9._Fld18073_RTRef = CASE WHEN T6.Q_001_F_000RRef IS NOT NULL THEN @P8 END AND T9._Fld18073_RRRef = T6.Q_001_F_000RRef))
WHERE (T8._Fld18006RRef = T6.Q_001_F_000RRef) AND (T8._Fld18007RRef = @P9) AND T9._Fld18070_TYPE IS NULL AND T9._Fld18070_RTRef IS NULL AND T9._Fld18070_RRRef IS NULL)))))))))))', N'P1 varbinary(16),@P2 varbinary(1),@P3 numeric(1,0),@P4 varbinary(1),@P5 varbinary(4),@P6 varbinary(16),@P7 varbinary(16),@P8 varbinary(4),@P9 varbinary(16)', 0x952C00221955602611E096594C3181ED, 0x00, 1, 0x08, 0x0000003E, 0x00000000000000000000000000000000, 0x945EE1C629CC683A48F06881D44A773A, 0x00000044, 0xAC3489582A1C66674D560056193029AE
   Axel2009
 
18 - 26.12.12 - 13:44
без разрешенные то же одно поле флаг на возможность использования данной строки через И
exec sp_executesql N'SELECT
CASE WHEN (EXISTS(SELECT
1
FROM (SELECT 1 AS SDBL_DUMMY) SDBL_DUAL
LEFT OUTER JOIN (SELECT DISTINCT
P1 AS SDBL_RLS_SIGNAL_,
T3._Reference68_IDRRef AS Q_001_F_000RRef
FROM _Reference68_VT1656 T3 WITH(NOLOCK)
WHERE (T3._Fld1658RRef = @P2)) T2
ON 1=1
WHERE ((T1._Folder = @P3) OR ((NOT ((T2.Q_001_F_000RRef IS NULL))) AND (NOT ((EXISTS(SELECT
@P4 AS Q_002_F_000_
FROM _InfoRg18005 T4 WITH(NOLOCK)
LEFT OUTER JOIN _InfoRg18069 T5 WITH(NOLOCK)
ON ((((T5._Fld18070_TYPE = @P5 AND T5._Fld18070_RTRef = @P6 AND T5._Fld18070_RRRef = ISNULL(T1._Fld1931RRef,@P7)) AND (T5._Fld18071RRef = T4._Fld18007RRef)) AND (T5._Fld18072RRef = @P8)) AND (T5._Fld18073_TYPE = CASE WHEN T2.Q_001_F_000RRef IS NOT NULL THEN @P5 END AND T5._Fld18073_RTRef = CASE WHEN T2.Q_001_F_000RRef IS NOT NULL THEN @P9 END AND T5._Fld18073_RRRef = T2.Q_001_F_000RRef))
WHERE (T4._Fld18006RRef = T2.Q_001_F_000RRef) AND (T4._Fld18007RRef = P10) AND T5._Fld18070_TYPE IS NULL AND T5._Fld18070_RTRef IS NULL AND T5._Fld18070_RRRef IS NULL))))))) AND EXISTS(SELECT
1
FROM (SELECT 1 AS SDBL_DUMMY) SDBL_DUAL
LEFT OUTER JOIN (SELECT DISTINCT
P1 AS SDBL_RLS_SIGNAL_,
T7._Reference68_IDRRef AS Q_001_F_000RRef
FROM _Reference68_VT1656 T7 WITH(NOLOCK)
WHERE (T7._Fld1658RRef = @P2)) T6
ON 1=1
WHERE (NOT ((((T1._Folder = @P3) OR ((NOT ((T6.Q_001_F_000RRef IS NULL))) AND (NOT ((EXISTS(SELECT
@P4 AS Q_002_F_000_
FROM _InfoRg18005 T8 WITH(NOLOCK)
LEFT OUTER JOIN _InfoRg18069 T9 WITH(NOLOCK)
ON ((((T9._Fld18070_TYPE = @P5 AND T9._Fld18070_RTRef = @P6 AND T9._Fld18070_RRRef = ISNULL(T1._Fld1931RRef,@P7)) AND (T9._Fld18071RRef = T8._Fld18007RRef)) AND (T9._Fld18072RRef = @P8)) AND (T9._Fld18073_TYPE = CASE WHEN T6.Q_001_F_000RRef IS NOT NULL THEN @P5 END AND T9._Fld18073_RTRef = CASE WHEN T6.Q_001_F_000RRef IS NOT NULL THEN @P9 END AND T9._Fld18073_RRRef = T6.Q_001_F_000RRef))
WHERE (T8._Fld18006RRef = T6.Q_001_F_000RRef) AND (T8._Fld18007RRef = P10) AND T9._Fld18070_TYPE IS NULL AND T9._Fld18070_RTRef IS NULL AND T9._Fld18070_RRRef IS NULL))))))))))) THEN P1 ELSE @P3 END,
T1._IDRRef,
T1._Fld1916,
T1._Fld1917
FROM _Reference115 T1 WITH(NOLOCK)', N'P1 varbinary(1),@P2 varbinary(16),@P3 varbinary(1),@P4 numeric(1,0),@P5 varbinary(1),@P6 varbinary(4),@P7 varbinary(16),@P8 varbinary(16),@P9 varbinary(4),P10 varbinary(16)', 0x01, 0x952C00221955602611E096594C3181ED, 0x00, 1, 0x08, 0x0000003E, 0x00000000000000000000000000000000, 0x945EE1C629CC683A48F06881D44A773A, 0x00000044, 0xAC3489582A1C66674D560056193029AE


Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует