powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Цикл по элементам массива
5 сообщений из 5, страница 1 из 1
Цикл по элементам массива
    #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
Цикл по элементам массива
    #40054233
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sp_msforeachtable или курсор.
...
Рейтинг: 0 / 0
Цикл по элементам массива
    #40054240
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Georg IV,

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

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

/*
* Right level: 0 - Deny; 1 - CanRead; 2 - CanEdit
*
* Operation: 0 - Чтение; 1 - Изменение; 2 - Удаление
*/
...
Рейтинг: 0 / 0
Цикл по элементам массива
    #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
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Цикл по элементам массива
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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