|
Соединения с основной таблицей в 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 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |