2010-12-02 7 views
0

J'utilise SQL Server R2.Comment créer un déclencheur qui utilise les résultats d'une fonction définie par l'utilisateur pour l'insérer dans une autre table

Deux tables:

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

Lorsqu'un enregistrement est inséré dans ParentEntryRelation, un déclencheur a besoin pour obtenir la liste des ids des utilisateurs qui ont actuellement accès à pied la table ParentEntryRelation, et insérez la ENTRYID et UserId dans UserEntryAccess. J'ai une fonction avec une expression de table commune récursive qui récupère ces identifiants d'utilisateur. Fonctionne très bien, yippee.

La question: Quelle requête SQL simple puis-je utiliser pour appeler la fonction pour chaque enregistrement de la table inserted et insérez ces résultats avec le ENTRYID en UserEntryAccess en une seule instruction SQL.

Voici le CTE récursive:

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 

Répondre

2

On dirait que vous voudriez utiliser un CROSS APPLY.

insert into UserEntryAccess 
    (EntryId, UserId) 
    select i.EntryId, f.userId 
     from inserted i 
      cross apply [dbo].[GetUserAccessIds](i.EntryId) f