Sql server 2008 从权限桥接表中删除错误数据的T-SQL转换脚本

Sql server 2008 从权限桥接表中删除错误数据的T-SQL转换脚本,sql-server-2008,tsql,sql-delete,Sql Server 2008,Tsql,Sql Delete,我的目标是编写一个循环/转换,它将遍历每个容器(acucore\u securitycontainer表),并根据下面的脚本清除所有权限(acucore\u securitypermission桥表)。我不在乎我是否有两个剧本。。那很好。请注意,这两个清理查询之间的区别是“S:”与“H:”和“唾液:”与“头发:” Query#1(用于头发应用程序上下文安全): DELETE FROM dbo.acucore_securitypermission WHERE 'ENTITYID:' +

我的目标是编写一个循环/转换,它将遍历每个容器(acucore\u securitycontainer表),并根据下面的脚本清除所有权限(acucore\u securitypermission桥表)。我不在乎我是否有两个剧本。。那很好。请注意,这两个清理查询之间的区别是“S:”与“H:”和“唾液:”与“头发:”

Query#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
    )
)
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
    )
)
Query#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 '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
    )
)
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
    )
)

我想出来了。。我只是用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

我错过了什么,你没有你需要的吗?没有循环。。我们有数百个容器,所以我不想为每个容器手动运行两次。