В Террасофт реализована вполне удобная система раздачи прав. По крайней мере, если разобраться ![]()
Но она позволяет настраивать только права на будущие записи. Те, которые уже созданы, приходится обрабатывать поштучно (в 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