0

role_permissions と呼ばれる結合テーブルを使用して、役割と権限のテーブルがあります。

すべての役割について、その役割がまだ権限を持っていない場合は、新しい権限を挿入したいと考えています。私のループの問題は、単一の行 (役割) しか更新されないことです。ループは、各ループでサブクエリ (権限を持たない最初のロールを見つける) を適切に再評価するようには見えません。

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
4

4 に答える 4

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
于 2012-09-07T12:46:24.793 に答える
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))
于 2012-09-07T12:46:53.290 に答える
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);  
于 2012-09-07T14:25:16.040 に答える
0

ループは必要ありません。これは、1 つの挿入ステートメントで実行できます。

;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 
于 2012-09-07T12:45:22.413 に答える