2011-12-02 1 views
0

내 목표는 각 컨테이너 (acucore_securitycontainer 테이블)를 통과하고 아래 스크립트를 기반으로 모든 사용 권한 (acucore_securitypermission 브리지 테이블)을 정리하는 루프/변환을 작성하는 것입니다. . 두 개의 스크립트로 끝나면 상관 없어요. 완전히 괜찮아요. 이 두 가지 정리 쿼리의 차이점은 "S :"대 "H :"및 "Saliva :"대 "Hair :"입니다.권한 테이블에서 불량 데이터를 삭제하는 T-SQL 변환 스크립트

쿼리 # 1 (헤어 애플리케이션 컨텍스트 보안을 위해) :

DELETE FROM dbo.acucore_securitypermission 
WHERE 
    'ENTITYID:' + cast(dbo.acucore_securitypermission.entityid as VARCHAR(64)) + '|' 
    + 'ESID:' + cast(dbo.acucore_securitypermission.esid as VARCHAR(64)) IN 
(
    SELECT 
     'ENTITYID:' + cast(dbo.acucore_securitypermission.entityid as VARCHAR(64)) + '|' 
     + 'ESID:' + cast(dbo.acucore_securitypermission.esid as VARCHAR(64)) 
    FROM dbo.acucore_securitypermission 
    JOIN dbo.acucore_securitycontainer ON dbo.acucore_securitypermission.esid = dbo.acucore_securitycontainer.esid 
    JOIN dbo.acucore_securitygroup ON dbo.acucore_securitypermission.entityid = dbo.acucore_securitygroup.entityid 
    WHERE containername LIKE 'H:UI.Web.AccessioningDashboard' 
    AND groupname NOT IN 
    (
     SELECT 
      CASE WHEN groupname IN ('Accessioning', 'Screening', 'Positive Certify', 'Negative Certify', 'Confirmation') THEN 'Hair: ' + groupname ELSE groupname END AS 'custom groupname' 
     FROM dbo.acucore_securitypermission 
     JOIN dbo.acucore_securitycontainer ON dbo.acucore_securitypermission.esid = dbo.acucore_securitycontainer.esid 
     JOIN dbo.acucore_securitygroup ON dbo.acucore_securitypermission.entityid = dbo.acucore_securitygroup.entityid 
     WHERE containername = 'UI.Web.AccessioningDashboard' 
     AND permissions = 1 
    ) 
) 

쿼리 # 2 (타액을위한 애플리케이션 컨텍스트 보안) :

DELETE FROM dbo.acucore_securitypermission 
WHERE 
    'ENTITYID:' + cast(dbo.acucore_securitypermission.entityid as VARCHAR(64)) + '|' 
    + 'ESID:' + cast(dbo.acucore_securitypermission.esid as VARCHAR(64)) IN 
(
    SELECT 
     'ENTITYID:' + cast(dbo.acucore_securitypermission.entityid as VARCHAR(64)) + '|' 
     + 'ESID:' + cast(dbo.acucore_securitypermission.esid as VARCHAR(64)) 
    FROM dbo.acucore_securitypermission 
    JOIN dbo.acucore_securitycontainer ON dbo.acucore_securitypermission.esid = dbo.acucore_securitycontainer.esid 
    JOIN dbo.acucore_securitygroup ON dbo.acucore_securitypermission.entityid = dbo.acucore_securitygroup.entityid 
    WHERE containername LIKE 'S:UI.Web.AccessioningDashboard' 
    AND groupname NOT IN 
    (
     SELECT 
      CASE WHEN groupname IN ('Accessioning', 'Screening', 'Positive Certify', 'Negative Certify', 'Confirmation') THEN 'Saliva: ' + groupname ELSE groupname END 
     FROM dbo.acucore_securitypermission 
     JOIN dbo.acucore_securitycontainer ON dbo.acucore_securitypermission.esid = dbo.acucore_securitycontainer.esid 
     JOIN dbo.acucore_securitygroup ON dbo.acucore_securitypermission.entityid = dbo.acucore_securitygroup.entityid 
     WHERE containername = 'UI.Web.AccessioningDashboard' 
     AND permissions = 1 
    ) 
) 
+0

내가 누락 된 항목이 있습니까? 필요한 항목이 없습니다. –

+0

루프가 없었습니다. 수백 개의 컨테이너가 있으므로 각 컨테이너에 대해 수동으로 두 번 실행하지 않으려했습니다. – MacGyver

답변

0

는 .. 그것을 알아 냈다 I 2 개의 타액으로 2 개의 머리 세트 명령을 스위치 아웃하십시오. 그래서 이걸 두 번 실행해야합니다.

DROP TABLE #Temp 
SELECT * 
INTO #Temp 
FROM dbo.acucore_securitycontainer 
WHERE containername LIKE 'UI.Web.%' 

Declare @conversioncontainerid UNIQUEIDENTIFIER 
Declare @conversioncontainername VARCHAR(64) 

WHILE (SELECT Count(*) FROM #Temp) > 0 
BEGIN 

    SELECT TOP 1 @conversioncontainerid = containerid FROM #Temp 
    SELECT TOP 1 @conversioncontainername = containername FROM #Temp 

    ---- start processing for container ---- 

    DECLARE @containerprefix VARCHAR(10); 
    DECLARE @groupprefix VARCHAR(10); 
    DECLARE @sourcecontainername VARCHAR(64); -- container from loop 
    DECLARE @targetcontainername VARCHAR(64); 
    SET @sourcecontainername = @conversioncontainername 
    SET @targetcontainername = @conversioncontainername 

    -- hair 
    SET @containerprefix = 'H:' -- no space at end! 
    SET @groupprefix = 'Hair: ' -- space at end! 

    -- saliva 
    --SET @containerprefix = 'S:' -- no space at end! 
    --SET @groupprefix = 'Saliva: ' -- space at end! 

    -- view exclusion groups (groups of a "good" container): 

    --SELECT 
    -- CASE WHEN groupname IN ('Accessioning', 'Screening', 'Positive Certify', 'Negative Certify', 'Confirmation') THEN @groupprefix + groupname ELSE groupname END 
    --FROM dbo.acucore_securitypermission 
    --JOIN dbo.acucore_securitycontainer ON dbo.acucore_securitypermission.esid = dbo.acucore_securitycontainer.esid 
    --JOIN dbo.acucore_securitygroup ON dbo.acucore_securitypermission.entityid = dbo.acucore_securitygroup.entityid 
    --WHERE containername = @sourcecontainername 
    --AND permissions = 1 

    ---- rows to be deleted: 

    --SELECT 
    -- groupname, 
    -- containername, 
    -- dbo.acucore_securitypermission.esid , 
    -- dbo.acucore_securitypermission.entityid , 
    -- dbo.acucore_securitypermission.permissions  
    --FROM dbo.acucore_securitypermission 
    --JOIN dbo.acucore_securitycontainer ON dbo.acucore_securitypermission.esid = dbo.acucore_securitycontainer.esid 
    --JOIN dbo.acucore_securitygroup ON dbo.acucore_securitypermission.entityid = dbo.acucore_securitygroup.entityid 
    --WHERE containername LIKE @containerprefix + @targetcontainername 
    --AND groupname NOT IN 
    --(
    -- SELECT 
    --  CASE WHEN groupname IN ('Accessioning', 'Screening', 'Positive Certify', 'Negative Certify', 'Confirmation') THEN @groupprefix + groupname ELSE groupname END 
    -- FROM dbo.acucore_securitypermission 
    -- JOIN dbo.acucore_securitycontainer ON dbo.acucore_securitypermission.esid = dbo.acucore_securitycontainer.esid 
    -- JOIN dbo.acucore_securitygroup ON dbo.acucore_securitypermission.entityid = dbo.acucore_securitygroup.entityid 
    -- WHERE containername = @sourcecontainername 
    -- AND permissions = 1 
    --) 

    DELETE FROM dbo.acucore_securitypermission 
    WHERE 
     'ENTITYID:' + cast(dbo.acucore_securitypermission.entityid as VARCHAR(64)) + '|' 
     + 'ESID:' + cast(dbo.acucore_securitypermission.esid as VARCHAR(64)) IN 
    (
     SELECT 
      'ENTITYID:' + cast(dbo.acucore_securitypermission.entityid as VARCHAR(64)) + '|' 
      + 'ESID:' + cast(dbo.acucore_securitypermission.esid as VARCHAR(64)) 
     FROM dbo.acucore_securitypermission 
     JOIN dbo.acucore_securitycontainer ON dbo.acucore_securitypermission.esid = dbo.acucore_securitycontainer.esid 
     JOIN dbo.acucore_securitygroup ON dbo.acucore_securitypermission.entityid = dbo.acucore_securitygroup.entityid 
     WHERE containername LIKE @containerprefix + @targetcontainername 
     AND groupname NOT IN 
     (
      SELECT 
       CASE WHEN groupname IN ('Accessioning', 'Screening', 'Positive Certify', 'Negative Certify', 'Confirmation') THEN @groupprefix + groupname ELSE groupname END 
      FROM dbo.acucore_securitypermission 
      JOIN dbo.acucore_securitycontainer ON dbo.acucore_securitypermission.esid = dbo.acucore_securitycontainer.esid 
      JOIN dbo.acucore_securitygroup ON dbo.acucore_securitypermission.entityid = dbo.acucore_securitygroup.entityid 
      WHERE containername = @sourcecontainername 
      AND permissions = 1 
     ) 
    )  
    -- finish processing 
    DELETE #Temp Where containerid = @conversioncontainerid -- delete row so we don't loop over it again 
END 
관련 문제