2016-07-16 2 views
0

Я настроил безопасность на уровне строк, а затем я хочу создать представление sql на основе этого для поддержки моего настраиваемого отчета.Acumatica: представление Sql на основе уровня уровня безопасности

Обновлено, ниже мой взгляд

SELECT 
     s.CompanyID 
     , DistributorID = s.BranchID 
     , s.SiteID 
     , s.SiteCD 
     , s.Descr 
     , s.Active 
     , IsDefault = s.UsrIsDefault 
     , u.Username 
    FROM 
     dbo.INSite s 
     FULL JOIN dbo.Users u ON u.CompanyID = s.CompanyID 
    WHERE 
     SUBSTRING(s.GroupMask, 1, 4) = '' 
     OR (0 = SUBSTRING(s.GroupMask, 1, 4) & (SELECT SUM(CONVERT(BIGINT, rg.GroupMask & -1)) 
              FROM dbo.RelationGroup rg 
              WHERE rg.CompanyID = s.CompanyID AND rg.Active = 1 AND rg.SpecificType = 'PX.Objects.IN.INSite') 
     OR 0 <> SUBSTRING(s.GroupMask, 1, 4) & CONVERT(BIGINT, u.GroupMask)) 

Но, это не правильно

+0

так в чем проблема и что вы пробовали? – Hybridzz

+0

Я обновил, как указано выше, –

+0

Вы пытаетесь распечатать информацию о безопасности на уровне строк? – Hybridzz

ответ

0

кажется, что вы расчеты по группам ограничения не являются правильными:

Позвольте мне поделиться с вами, как делает он работает. для каждой системы группы назначить один байт:

  • Группа 1 - 0x8000 = 1000 0000 0000 0000
  • Группа 2 - 0x4000 = 0100 0000 0000 0000
  • Группа 3 - 0x2000 = 0010 0000 0000 0000
  • Группа 4 - 0x1000 = 0001 0000 0000 0000
  • Группа 5 - 0x0800 = 0000 1000 0000 0000
  • Группа 6 - 0x0400 = 0000 0100 0000 0000
  • .... .

При назначении элемента к любой группе она фактически устанавливает флаги в группе масок: Давайте предположим, что поставщик принадлежит к группе 3 и группе 6, чем маска будет:

0010 0100 0000 0000 = 0x2400

Это можно увидеть в групповых масках для каждой поддерживаемой таблицы.

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

В вашем случае вы присоединяетесь ко всем сущностям для пользователей, которые не верны. Я думаю, вам нужно написать какую-то процедуру/функцию, которая получит доступные группы для сущности и пользователя и присоединиться к этому условию. Возможно, вам просто нужно найти, какой пользователь и сущность имеют хотя бы один бит в одной позиции - это означает, что объект и пользователь принадлежат к одной группе, но это будет работать только для группы A.

Также, сложность заключается в том, что SQL Server не поддерживает побитовые операции между двумя двоичными файлами (https://msdn.microsoft.com/en-us/library/ms176122.aspx), поэтому вам нужно преобразовать его в int. Чтобы избежать переполнения, вы должны получить только часть строки и сравнить часть за частью. Я предпочитаю пытаться получить Группы от сущности и пользователя и побитовое выполнение бит, чтобы убедиться, что переполнения нет.

Надеюсь, что это поможет.

Смежные вопросы