Имя: Пароль:
1C
1С v8
Соединения с основной таблицей в RLS
0 fisher
 
25.12.12
17:23
Встречал в типовых RLS сразу соединение основной таблицы со справочником групп пользователей. Т.е. ежели пользователь входит в две группы и в обеих у него есть права на запись основной таблицы, то...
Короче, не совсем понятно, как платформа рулит ситуацию, когда RLS пытается "размножить" записи основной таблицы. Похоже игнорирует инсинуации. Но это вообще документированный случай?
1 AversDik2
 
25.12.12
17:28
RLS проверять Результат.Пустой()  или нет
2 fisher
 
25.12.12
17:34
Это документировано где-то? Просто интересно.
Если смело опираться на эту фишку, то можно более эффективные RLS писать.
3 Axel2009
 
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
4 fisher
 
25.12.12
17:56
Гы! Фиг бы догадался, что именно так реализовано :)
5 fisher
 
25.12.12
17:57
Спасибо.
6 Axel2009
 
25.12.12
17:59
(5) да я тоже не догадывался... не самый быстрый способ избрали
7 fisher
 
25.12.12
18:00
Хотя стоп. Я правильно понял, что сервер приложений получает всю выборку? Просто с признаком есть право или нет?
А нафига так сделано? Зачем ему лишние записи?
8 fisher
 
25.12.12
18:04
И исходя из этого неясно, как реализуются для разных полей разные ограничения...
Похоже, это профайлинг просто попытки открытия документа?
9 Axel2009
 
25.12.12
18:05
(7) мне лениво было делать выборку разрешенные. я сделал открытие списка контрагентов. вот эту хрень он посылает серверу=) нафига так сделано я хз.
но вполне возможно, что он же тебе потом щелкнет по носу, если ты попытаешься прочитать данные, к которым нет доступа...
10 Axel2009
 
25.12.12
18:05
(8) надо затестить. завтра попробую =) напишу
11 fisher
 
25.12.12
18:07
(9) Да, точно - справочника. Если списка - тогда непонятно, почему запрос на конкретный элемент...
12 Axel2009
 
25.12.12
18:15
(11) хыхы, таких запросов было 3 =) я проскролил вниз список
13 Axel2009
 
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
14 Axel2009
 
25.12.12
18:16
хотя туплю =) это отображение строки
15 Axel2009
 
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
16 Axel2009
 
26.12.12
13:38
(15) это я выбираю поле, которое участвует в ограничении
17 Axel2009
 
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
18 Axel2009
 
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
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.