В Террасофт реализована вполне удобная система раздачи прав. По крайней мере, если разобраться ![]()
Но она позволяет настраивать только права на будущие записи. Те, которые уже созданы, приходится обрабатывать поштучно (в 3.4.1 можно уже постранично
).
Что же делать бедным администраторам или CRM-координаторам, когда надо, например, ввести новую группу пользователей или переопределить права для старой - ведь это должно касаться, как новых, так и уже созданных записей.
В моей практике подобные ситуации встречались уже не раз. В конце концов, я устал мастерить костыли и сделал себе несколько скриптов для решения подобных задач.
Делюсь с вами.
Считаю, что если Вы читаете это, значит Вы уже знаете, что такое tbl_AccountGroupRight, sq_Service, ds_ItemRight, Dataset.IsEOF, declare cursor и т.д. Хотя это вовсе необязательно, чтобы использовать скрипты - просто мне лень их полностью комментировать ![]()
1. С чего я начал - скорее для истории, чем для нужд населения
2. проходной вариант
3. Уже что-то полезное (Скрипт JS)
4. Самое вкусное для терпеливых
1. С чего я начал - скорее для истории, чем для нужд населения :smile:
Добавление прав на продажи_контакты_контрагенты для пользователя\группы
[sql]
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
[/sql]
Выставить прав для определенного пользователя\группы в конкретной таблице
[sql]
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')
[/sql]
2. В контексте решения одной задачи и после долгих мучений была создана процедура:
особого внимания ей уделять не стоит - это проходной вариант
В конкретной таблице (параметр) для конкретной записи (параметр) выставляет права, как будто она была создана от имени конкретного пользователя (параметр) входящего в конкретную группу (не параметр)
[sql]
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
[/sql]
tsp_updaterightsbydefaults.rar
PS. Не забываем - на процедуры надо давать права на исполнения для роли public
3. Уже что-то полезное
Скрипт (JS для клиента - не SQL!!)
Добавляет во все записи все таблиц прав права для конкретного пользователя\группы. Либо редактирует, если уже есть такие права.
Опустил из скрипта таблицы прав на записи групп (например tbl_AccountGroupRight) - т.к. это было не надо, и там немного запутанно - не стал тратить время
ВАЖНО:
* создавался на версии 3.4.1
* для sq_Service надо добавить фильтр IsRightsTable:
![]()
[javascript]
//см приложение
[/javascript]
4. Самое вкусное для терпеливых :biggrin:
основано на скриптах от техподдержки, которые (в связи со спецификой :wink:) у меня работали неправильно или вообще не.
делал на 3.4.1 XRM
Раздает, используя механизм аналогичный базовому из триггеров для прав, права по-умолчанию для ВСЕХ записей ВСЕХ таблиц, для которых есть таблица прав. Таблицы берутся по принципу:
[sql]
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'
)
[/sql]
В двух вариантах:
1. как будто запись создал тот, кто ее создал :lol: (CreatedByID), если есть такой юзер, иначе подставляется из переменной @DefaultGroupID - не забудьте поставить свое
2. как будто запись создал ответственный (OwnerID), если есть такое поле в таблице и такой юзер, иначе - как в п.1
есть такой юзер означает, что заведен (и не удален, как было в моем случае) пользователь с таким контактом и он активен (активность необязательна - смотрите сами, надо ли):
[sql]
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
[/sql]
prava_po-umolchaniyu_po_otvetstvennomu.rar
prava_po-umolchaniyu_po_sozdatelyu.rar
осторожнее с правами на записи, созданные Supervisor'ом (такие, как например, корневые группы типа Все контрагенты) - создайте для него права по-умолчанию, чтобы не было проблем
я бы даже советовал вообще исключить группы записей из этого процесса
актуальная версия сервисов
извините, нет времени описывать
defaultrigths.rar