В Террасофт реализована вполне удобная система раздачи прав. По крайней мере, если разобраться
Но она позволяет настраивать только права на будущие записи. Те, которые уже созданы, приходится обрабатывать поштучно (в 3.4.1 можно уже постранично ).
Что же делать бедным администраторам или CRM-координаторам, когда надо, например, ввести новую группу пользователей или переопределить права для старой - ведь это должно касаться, как новых, так и уже созданных записей.
В моей практике подобные ситуации встречались уже не раз. В конце концов, я устал мастерить костыли и сделал себе несколько скриптов для решения подобных задач.
Делюсь с вами.
Считаю, что если Вы читаете это, значит Вы уже знаете, что такое tbl_AccountGroupRight, sq_Service, ds_ItemRight, Dataset.IsEOF, declare cursor и т.д. Хотя это вовсе необязательно, чтобы использовать скрипты - просто мне лень их полностью комментировать
1. С чего я начал - скорее для истории, чем для нужд населения
2. проходной вариант
3. Уже что-то полезное (Скрипт JS)
4. Самое вкусное для терпеливых
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')
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:
//см приложение
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