2012-09-07 2 views
0

role_permissions라는 조인 테이블에서 역할 및 사용 권한 테이블이 있습니다.TSQL 루프가 존재하지 않는 곳

모든 역할에 대해 해당 역할에 아직 권한이없는 경우 새 권한을 삽입하고 싶습니다. 내 루프의 문제점은 단일 행 (역할) 만 업데이트된다는 것입니다. 루프는 제대로 각 루프

DECLARE @role_id INT 

SET @role_id = (SELECT TOP 1 role_id FROM p_role_permissions WHERE NOT EXISTS (SELECT NULL FROM p_role_permissions WHERE permission_id = 57)) 

WHILE @role_id IS NOT NULL 
BEGIN 

INSERT INTO p_role_permissions (role_id, permission_id) VALUES(@role_id, 57) 
-- does not appear to evaluate correctly (works only on the first loop) 
SET @role_id = (SELECT TOP 1 role_id FROM p_role_permissions WHERE NOT EXISTS (SELECT NULL FROM p_role_permissions WHERE permission_id = 57)) 

END 

답변

0

당신은 루프가 필요하지 않습니다에 (권한이없는 최초의 역할을 발견) 서브 쿼리를 다시 평가하기 위해 표시되지 않습니다. 하나의 insert 문에서이 작업을 수행 할 수 있습니다.

;WITH RolesToAdd 
    AS (SELECT role_id 
     FROM p_role_permissions /*Would be better to use a roles table here */ 
     EXCEPT 
     SELECT role_id 
     FROM p_role_permissions 
     WHERE permission_id = 57) 
INSERT INTO p_role_permissions 
      (role_id, 
      permission_id) 
SELECT role_id, 
     57 
FROM RolesToAdd 
0

여기에 몇 가지 가정을 만들기 좋아,하지만 난 그냥이 작업을 수행 할 수 있으리라 생각합니다 :

더 할 역할을 취득 허가 (57)이 :

INSERT INTO p_role_permissions (role_id, permission_id) 
    SELECT 
     rp.Id, 
     57 
    FROM 
     (SELECT 
      r.Id 
     FROM roles as r 
     LEFT OUTER JOIN p_role_permissions as rp 
     ON r.Id = rp.Role_Id AND rp.Permission_Id = 57 

     WHERE r.Id IS NULL) as nr 
0
INSERT INTO p_role_permissions (role_id, permission_id) (SELECT role_id, 57 FROM p_role_permissions WHERE NOT EXISTS (SELECT NULL FROM p_role_permissions WHERE permission_id = 57)) 
+0

귀하' NOT EXISTS' 하위 쿼리는 외부 쿼리와 상관 관계가 없습니다. –

0
MERGE INTO p_role_permissions 
USING (SELECT DISTINCT roleid, 57 FROM p_role_permissions) AS src 
ON (p_role_permissions) 
WHEN NOT MATCHED THEN 
    INSERT p_role_permissions (role_id, permission_id) 
    VALUES (role_id, 57); 
관련 문제