Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Цикл по элементам массива / 5 сообщений из 5, страница 1 из 1
16.03.2021, 17:57
    #40054226
Georg IV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по элементам массива
Здравствуйте!
Прошу помощи, так как не очень глубоко разбираюсь в SQL.
Ниже код, который выполняется к таблице, которая указана в @TableName.
Как можно переписать его, чтобы на вход подавать список таблиц и к каждой выполнялся бы этот код.
То есть задавать массив названий таблиц и проходить по каждому элементу циклом.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
/*
* Right level: 0 - Deny; 1 - CanRead; 2 - CanEdit
*
* Operation: 0 - Чтение; 1 - Изменение; 2 - Удаление
*/
DECLARE @TableName NVARCHAR(250)
SET @TableName = 'Contact' -- ЗДЕСЬ ВПИСЫВАЕТСЯ НАЗВАНИЕ ТАБЛИЦЫ
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'
...
Рейтинг: 0 / 0
16.03.2021, 18:05
    #40054233
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по элементам массива
sp_msforeachtable или курсор.
...
Рейтинг: 0 / 0
16.03.2021, 18:12
    #40054240
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по элементам массива
Georg IV,

сохраните код в виде процедуры, CREATE PROC dbo.Proc1 @TableName NVARCHAR(250) as EXEC ('...');

и выполняйте процедуру EXEC bo.Proc1 @TableName = 'table1';
Список имён можно поместить в таблицу и по очереди выполнять процедуру в теле курсора к этой таблице. Читайте о таблицах, курсорах и процедурах в справке.
...
Рейтинг: 0 / 0
16.03.2021, 18:16
    #40054243
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по элементам массива
Т.е. вы уверены, что здесь правильно переведено, а то мало ли

/*
* Right level: 0 - Deny; 1 - CanRead; 2 - CanEdit
*
* Operation: 0 - Чтение; 1 - Изменение; 2 - Удаление
*/
...
Рейтинг: 0 / 0
17.03.2021, 12:53
    #40054539
Georg IV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по элементам массива
Мне кажется, у меня получилось.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
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 
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Цикл по элементам массива / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]