Коррекция прав доступа

В Террасофт реализована вполне удобная система раздачи прав. По крайней мере, если разобраться :wink:

Но она позволяет настраивать только права на будущие записи. Те, которые уже созданы, приходится обрабатывать поштучно (в 3.4.1 можно уже постранично :biggrin:).
Что же делать бедным администраторам или CRM-координаторам, когда надо, например, ввести новую группу пользователей или переопределить права для старой - ведь это должно касаться, как новых, так и уже созданных записей.

В моей практике подобные ситуации встречались уже не раз. В конце концов, я устал мастерить костыли и сделал себе несколько скриптов для решения подобных задач.

Делюсь с вами.
Считаю, что если Вы читаете это, значит Вы уже знаете, что такое tbl_AccountGroupRight, sq_Service, ds_ItemRight, Dataset.IsEOF, declare cursor и т.д. Хотя это вовсе необязательно, чтобы использовать скрипты - просто мне лень их полностью комментировать :redface:

1. С чего я начал - скорее для истории, чем для нужд населения
2. проходной вариант
3. Уже что-то полезное (Скрипт JS)
4. Самое вкусное для терпеливых

Нравится

Поделиться

7 комментариев

1. С чего я начал - скорее для истории, чем для нужд населения :smile:

Добавление прав на продажи_контакты_контрагенты для пользователя\группы

CREATE TABLE #tbl_OpportunityRight(
	[ID] [uniqueidentifier] NULL,
	[RecordID] [uniqueidentifier] NULL,
	[AdminUnitID] [uniqueidentifier] NULL,
	[CanRead] [int] NULL,
	[CanWrite] [int] NULL,
	[CanDelete] [int] NULL,
	[CanChangeAccess] [int] NULL)
go 
 
insert into #tbl_OpportunityRight (RecordID) (select ID from tbl_Opportunity where ID in (select OpportunityID from tbl_OpportunityInGroup where GroupID = 'B66CAAD9-AF6B-4F12-B88C-1E3453F591C4'))
 
go
 
update #tbl_OpportunityRight set ID = NEWID(), AdminUnitID = '687D0624-5B5E-4F19-961E-D9F03A96939A', CanRead = '1', CanWrite = '1', CanDelete = '0', CanChangeAccess = '0';
 
insert into tbl_OpportunityRight select * from #tbl_OpportunityRight

Выставить прав для определенного пользователя\группы в конкретной таблице

update tbl_OpportunityRight set CanDelete = '0', CanWrite = '0', CanChangeAccess = '0'
	where ID in (select ID from tbl_OpportunityRight where AdminUnitID = 'D268BFB9-8118-4E3B-9F06-1D703D25C23E' and CanWrite = '1') 

_service.rar

2. В контексте решения одной задачи и после долгих мучений была создана процедура:
особого внимания ей уделять не стоит - это проходной вариант

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

USE [Our_backup]
GO
/****** Object:  StoredProcedure [dbo].[tsp_UpdateRightsByDefaults]    Script Date: 07/25/2013 16:57:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE procedure [dbo].[tsp_UpdateRightsByDefaults] 
	@ARightTableName sysname,
	@Owner_ID uniqueidentifier,
	@Record_ID uniqueidentifier,
	@ADBSchema sysname = 'dbo'
with execute as 'fkeys'
AS
BEGIN
	SET NOCOUNT ON;
  DECLARE @ServiceTableID uniqueidentifier
  DECLARE @AdminUnitID uniqueidentifier
  DECLARE @RecordID uniqueidentifier
  DECLARE @TableRightsName varchar(250)
  DECLARE @DefaultGroupID uniqueidentifier
  set @DefaultGroupID = (select ID from [tbl_AdminUnit] where Name = 'продажники') -- меняем имя или пишем конкретный ИД
 
  SET @ServiceTableID = (SELECT [ID] 
  FROM [dbo].[tbl_Service] 
	   WHERE [Code] = (replace(@ARightTableName, 'Right', ''))
    AND [ServiceTypeCode] = N'Table')
 
  SET @AdminUnitID = (SELECT ID from [dbo].[tbl_AdminUnit] where UserContactID = @Owner_ID)
  SET @TableRightsName = '[' + @ADBSchema + '].[' + @ARightTableName +']'
  SET @RecordID = @Record_ID
 
 exec(' DELETE' +@TableRightsName + ' where RecordID = ''' + @RecordID + ''' 
 
  INSERT INTO ' +@TableRightsName + ' (
    [ID]
    ,[RecordID]
    ,[AdminUnitID]
    ,[CanRead]
    ,[CanWrite]
    ,[CanDelete]
    ,[CanChangeAccess])
  SELECT
    newid()
    ,''' + @RecordID + '''
    ,''' + @AdminUnitID + '''
    ,1
    ,1
    ,0
    ,0
 
  INSERT INTO ' + @TableRightsName + ' (
    [ID]
    ,[RecordID]
    ,[AdminUnitID]
    ,[CanRead]
    ,[CanWrite]
    ,[CanDelete]
    ,[CanChangeAccess])
  SELECT
    newid()
    ,''' + @RecordID + '''
    ,[D].[SubjectAdminUnitID]
    ,[D].[CanRead]
    ,[D].[CanWrite]
    ,[D].[CanDelete]
    ,[D].[CanChangeAccess]
  FROM (
    SELECT
      [D].[SubjectAdminUnitID]
      ,MAX([D].[CanRead]) AS [CanRead]
      ,MAX([D].[CanWrite]) AS [CanWrite]
      ,MAX([D].[CanDelete]) AS [CanDelete]
      ,MAX([D].[CanChangeAccess]) AS [CanChangeAccess]
    FROM [dbo].[tbl_TableDefaultRight] AS [D]
    WHERE ([D].[TableServiceID] = ''' + @ServiceTableID + ''')
    AND ([D].[AdminUnitID] = ''' + @DefaultGroupID + ''' 
		 )
  GROUP BY [D].[SubjectAdminUnitID])
	AS [D]
 ')
	SET NOCOUNT OFF;
END

tsp_updaterightsbydefaults.rar

PS. Не забываем - на процедуры надо давать права на исполнения для роли public

3. Уже что-то полезное
Скрипт (JS для клиента - не SQL!!)

Добавляет во все записи все таблиц прав права для конкретного пользователя\группы. Либо редактирует, если уже есть такие права.
Опустил из скрипта таблицы прав на записи групп (например tbl_AccountGroupRight) - т.к. это было не надо, и там немного запутанно - не стал тратить время

ВАЖНО:
* создавался на версии 3.4.1
* для sq_Service надо добавить фильтр IsRightsTable:

//см приложение

scr_recreaterigths.rar

4. Самое вкусное для терпеливых :biggrin:
основано на скриптах от техподдержки, которые (в связи со спецификой :wink:) у меня работали неправильно или вообще не.
делал на 3.4.1 XRM

Раздает, используя механизм аналогичный базовому из триггеров для прав, права по-умолчанию для ВСЕХ записей ВСЕХ таблиц, для которых есть таблица прав. Таблицы берутся по принципу:

SELECT
	s1.[Code] AS [Code]
FROM
	[tbl_Service] AS s1
WHERE s1.[ServiceTypeCode] = 'Table'
and s1.Code <> 'tbl_TableField'
and exists( 
  select * from tbl_Service as s2
  where s2.Code = s1.Code + 'Right'
)

В двух вариантах:
1. как будто запись создал тот, кто ее создал :lol: (CreatedByID), если есть такой юзер, иначе подставляется из переменной @DefaultGroupID - не забудьте поставить свое
2. как будто запись создал ответственный (OwnerID), если есть такое поле в таблице и такой юзер, иначе - как в п.1

есть такой юзер означает, что заведен (и не удален, как было в моем случае) пользователь с таким контактом и он активен (активность необязательна - смотрите сами, надо ли):

	set @UserIsActive = (SELECT COUNT (*) FROM tbl_AdminUnit WHERE UserContactID = @OwnerID and UserIsEnabled = 1) -- UserIsEnabled = 1 опционально
	if (@UserIsActive != 0)
		set @AdminUnitID = (SELECT ID FROM tbl_AdminUnit WHERE UserContactID = @OwnerID)
	else set @AdminUnitID = @DefaultGroupID

prava_po-umolchaniyu_po_otvetstvennomu.rar
prava_po-umolchaniyu_po_sozdatelyu.rar

осторожнее с правами на записи, созданные Supervisor'ом (такие, как например, корневые группы типа Все контрагенты) - создайте для него права по-умолчанию, чтобы не было проблем

я бы даже советовал вообще исключить группы записей из этого процесса

актуальная версия сервисов
извините, нет времени описывать
defaultrigths.rar

Показать все комментарии