Скрипт:
DECLARE @TableName NVARCHAR(250) SET @TableName = 'Activity' -- ЗДЕСЬ ВПИСЫВАЕТСЯ НАЗВАНИЕ ТАБЛИЦЫ PRINT 'Start process ' + @TableName EXEC (' DELETE FROM Sys' + @TableName + 'Right; DECLARE @TableSchemaUId UNIQUEIDENTIFIER; SELECT top 1 @TableSchemaUId = UId FROM SysSchema WHERE [Name] = ''' + @TableName + ''' and [ExtendParent] = ''0'' /* Полный доступ автору записи */ INSERT INTO Sys' + @TableName + 'Right (CreatedOn, ModifiedOn, RecordId, SysAdminUnitId, Operation, RightLevel, Position, SourceId) SELECT GETUTCDATE(), GETUTCDATE(), o.Id, au.Id, op.Id, 2, 0, ''{4220CFBA-0514-44CE-ADD0-109B54B52084}'' -- Источник: Автор FROM ' + @TableName + ' o JOIN SysAdminUnit au ON (au.ContactId = o.CreatedById) CROSS JOIN (SELECT 0 Id UNION ALL SELECT 1 UNION ALL SELECT 2) op -- Операции: Чтение, Изменение, Удаление WHERE NOT EXISTS(SELECT * FROM Sys' + @TableName + 'Right WHERE RecordId = o.Id AND SysAdminUnitId = au.Id AND Operation = op.Id); /* Копирование прав по умолчанию */ INSERT INTO Sys' + @TableName + 'Right (CreatedOn, ModifiedOn, RecordId, SysAdminUnitId, Operation, RightLevel, Position, SourceId) SELECT DISTINCT GETUTCDATE(), GETUTCDATE(), o.Id, dr.GranteeSysAdminUnitId, dr.Operation, dr.RightLevel, 0, ''{F41E0268-E324-4228-9E9E-5CB7CC906398}'' -- Источник: По умолчанию FROM ' + @TableName + ' o JOIN SysAdminUnit au ON (au.ContactId = o.CreatedById) LEFT JOIN SysUserInRole uir ON (uir.SysUserId = au.Id) JOIN SysEntitySchemaRecordDefRight dr ON (dr.AuthorSysAdminUnitId = uir.SysRoleId OR dr.AuthorSysAdminUnitId = au.Id OR dr.AuthorSysAdminUnitId IN (SELECT Id FROM SysAdminUnit WHERE ParentRoleId IS NULL)) WHERE dr.SubjectSchemaUId = @TableSchemaUId AND NOT EXISTS(SELECT * FROM Sys' + @TableName + 'Right WHERE RecordId = o.Id AND SysAdminUnitId = dr.GranteeSysAdminUnitId AND Operation = dr.Operation); ') PRINT @TableName + ' was processed'
25 февраля 2019 19:00
Добрый день. Спасибо. Отличный скрипт. Думаю, стоит приложить файлом, Т.к. при копировании почти все попадает в одну строку.
19 марта 2021 11:03
Я немного модифицировал скрипт.
Таким образом можно одним скриптом пробегаться по всем нужным объектам (список задается во второй строке скрипта).
DECLARE @myTableVariable TABLE (name varchar(250)) insert into @myTableVariable values('Account'),('Contact') --объекты для обновления прав добавлять сюда в аналогичном формате. DECLARE @TableName VARCHAR(250) DECLARE db_cursor CURSOR FOR SELECT name from @myTableVariable OPEN db_cursor FETCH NEXT FROM db_cursor INTO @TableName WHILE @@FETCH_STATUS = 0 BEGIN PRINT 'Start process ' + @TableName EXEC (' DELETE FROM Sys' + @TableName + 'Right; DECLARE @TableSchemaUId UNIQUEIDENTIFIER; SELECT @TableSchemaUId = UId FROM SysSchema WHERE [Name] = ''' + @TableName + ''' /* Полный доступ автору записи */ INSERT INTO Sys' + @TableName + 'Right (CreatedOn, ModifiedOn, RecordId, SysAdminUnitId, Operation, RightLevel, Position, SourceId) SELECT GETUTCDATE(), GETUTCDATE(), o.Id, au.Id, op.Id, 2, 0, ''{4220CFBA-0514-44CE-ADD0-109B54B52084}'' -- Источник: Автор FROM ' + @TableName + ' o JOIN SysAdminUnit au ON (au.ContactId = o.CreatedById) CROSS JOIN (SELECT 0 Id UNION ALL SELECT 1 UNION ALL SELECT 2) op -- Операции: Чтение, Изменение, Удаление WHERE NOT EXISTS(SELECT * FROM Sys' + @TableName + 'Right WHERE RecordId = o.Id AND SysAdminUnitId = au.Id AND Operation = op.Id); /* Копирование прав по умолчанию */ INSERT INTO Sys'+@TableName+'Right (CreatedOn, ModifiedOn, RecordId, SysAdminUnitId, Operation, RightLevel, Position, SourceId) SELECT DISTINCT GETUTCDATE(), GETUTCDATE(), o.Id, dr.GranteeSysAdminUnitId, dr.Operation, dr.RightLevel, 0, ''{F41E0268-E324-4228-9E9E-5CB7CC906398}'' -- Источник: По умолчанию FROM '+@TableName+' o JOIN SysAdminUnit au ON (au.ContactId = o.CreatedById) LEFT JOIN SysUserInRole uir ON (uir.SysUserId = au.Id) JOIN SysEntitySchemaRecordDefRight dr ON (dr.AuthorSysAdminUnitId = uir.SysRoleId OR dr.AuthorSysAdminUnitId = au.Id OR dr.AuthorSysAdminUnitId IN (SELECT Id FROM SysAdminUnit WHERE ParentRoleId IS NULL)) WHERE exists ( select 1 from SysSchema where Name='''+@TableName+''' and dr.SubjectSchemaUId=UId ) AND NOT EXISTS(SELECT * FROM Sys'+@TableName+'Right WHERE RecordId = o.Id AND SysAdminUnitId = dr.GranteeSysAdminUnitId AND Operation = dr.Operation); ') PRINT @TableName + ' was processed' FETCH NEXT FROM db_cursor INTO @TableName END CLOSE db_cursor DEALLOCATE db_cursor
Показать все комментарии
Войдите или зарегистрируйтесь, что бы комментировать