开发者

How to create a trigger that uses the results from a UDF to insert into another table

I'm using SQL Server R2.

Two tables:

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

When a record is inserted into ParentEntryRelation, a trigger needs to get the list of user ids that currently have access by walking up the ParentEntryRelation table, and insert the EntryId and UserId into UserEntryAccess. I have a function with a recursive common table expression that retr开发者_开发知识库ieves these user ids. Works great, yippee.

The question: What single sql query can I use to call the function for every record in the INSERTED table, and insert THOSE results with the EntryId into UserEntryAccess in a single sql statement.

Here is the recursive 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


Sounds like you'd want to use a CROSS APPLY.

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜