2010-12-02 2 views
0

Я использую SQL Server R2.Как создать триггер, который использует результаты из UDF для вставки в другую таблицу

две таблицы:

UserEntryAccess (EntryId, UserId) 
ParentEntryRelation(Id, ParentType, ParentId, EntryId) 

Когда запись вставляется в ParentEntryRelation, триггер должен получить список пользователей идентификаторами, которые в настоящее время имеют доступ подходя к таблице ParentEntryRelation и вставьте EntryID и UserId в UserEntryAccess. У меня есть функция с рекурсивным общим табличным выражением, которое извлекает эти идентификаторы пользователя. Отлично работает, yippee.

Вопрос: Что одного SQL-запроса можно использовать для вызова функции для каждой записи в таблице ВСТАВЛЯЕМОГО, и вставьте их результаты с EntryID в UserEntryAccess в одном операторе SQL.

Вот рекурсивное CTE:

CREATE FUNCTION [dbo].[GetUserAccessIds](@entryId as uniqueidentifier) 
RETURNS @tempUserids table (userId uniqueidentifier) 
AS 
BEGIN 

WITH RecursiveEntry (ParentId,EntryId,ParentType) 
AS 
(
-- Anchor member definition 
SELECT ParentId,EntryId,ParentType from ParentEntryRelation 
where ParentEntryRelation.EntryId = @entryId 
UNION ALL 
-- Recursive member definition 
SELECT ParentEntryRelation.ParentId, 
ParentEntryRelation.EntryId, 
ParentEntryRelation.ParentType 
from ParentEntryRelation 
inner join RecursiveEntry on RecursiveEntry.ParentId = ParentEntryRelation.EntryId 
) 

insert into @tempUserids 
SELECT distinct ParentId 
from RecursiveEntry 
where ((ParentType & 32) = 32) --32 is the ServerUser type 
OPTION (MAXRECURSION 32767) 

RETURN 
END 

ответ

2

Похоже, вы хотели бы использовать CROSS APPLY.

insert into UserEntryAccess 
    (EntryId, UserId) 
    select i.EntryId, f.userId 
     from inserted i 
      cross apply [dbo].[GetUserAccessIds](i.EntryId) f 
Смежные вопросы