Untitled

 avatar
unknown
plain_text
20 days ago
2.1 kB
4
Indexable
CREATE FUNCTION dbo.CheckManagerCycles()
RETURNS BIT
AS
BEGIN
    DECLARE @HasCycles BIT = 0;

    WITH ManagerHierarchy AS (
        -- Base case: direct management relationships
        SELECT crewId, manager, 1 AS level
        FROM Managed
        WHERE toDate IS NULL  -- Only consider current relationships

        UNION ALL

        -- Recursive case: find higher level managers
        SELECT mh.crewId, m.manager, mh.level + 1
        FROM ManagerHierarchy mh
        JOIN Managed m ON mh.manager = m.crewId
        WHERE m.toDate IS NULL  -- Only consider current relationships
        AND level < (SELECT COUNT(*) FROM Crew)  -- Prevent infinite recursion
    )
    
    -- Check if any crew member appears in their own management chain
    IF EXISTS (
        SELECT 1
        FROM ManagerHierarchy
        WHERE crewId = manager
    )
    BEGIN
        SET @HasCycles = 1;
    END

    RETURN @HasCycles;
END;

-- Add the constraint using the function
ALTER TABLE Managed
ADD CONSTRAINT CHK_NoCycles
CHECK (dbo.CheckManagerCycles() = 0);CREATE FUNCTION dbo.CheckManagerCycles()
RETURNS BIT
AS
BEGIN
    DECLARE @HasCycles BIT = 0;

    WITH ManagerHierarchy AS (
        -- Base case: direct management relationships
        SELECT crewId, manager, 1 AS level
        FROM Managed
        WHERE toDate IS NULL  -- Only consider current relationships

        UNION ALL

        -- Recursive case: find higher level managers
        SELECT mh.crewId, m.manager, mh.level + 1
        FROM ManagerHierarchy mh
        JOIN Managed m ON mh.manager = m.crewId
        WHERE m.toDate IS NULL  -- Only consider current relationships
        AND level < (SELECT COUNT(*) FROM Crew)  -- Prevent infinite recursion
    )
    
    -- Check if any crew member appears in their own management chain
    IF EXISTS (
        SELECT 1
        FROM ManagerHierarchy
        WHERE crewId = manager
    )
    BEGIN
        SET @HasCycles = 1;
    END

    RETURN @HasCycles;
END;

-- Add the constraint using the function
ALTER TABLE Managed
ADD CONSTRAINT CHK_NoCycles
CHECK (dbo.CheckManagerCycles() = 0);
Leave a Comment