仅当过滤器谓词存在时才可以删除它吗?

pik*_*rie 3 sql t-sql sql-server

我正在 SQL Server 2014 中创建行级安全性。

可以在我的表 Client 上删除 FILTER PREDICATE,如下所示:

ALTER SECURITY POLICY rls.tenantAccessPolicy
    DROP FILTER PREDICATE ON dbo.Client,
    DROP BLOCK PREDICATE ON dbo.Client
GO
Run Code Online (Sandbox Code Playgroud)

但是如果我连续执行这段代码两次,就会出现错误

“安全策略‘rls.tenantAccessPolicy’不包含表‘dbo.Client’上的谓词。”

有没有办法仅在存在时删除它?

Luk*_*zda 5

我将使用方法IF EXISTS并检查sys.security_predicates元数据表:

IF EXISTS( SELECT 1
           FROM sys.security_predicates sp
           WHERE sp.predicate_type = 0 -- filter_predicate
             AND OBJECT_ID('rls.tenantAccessPolicy') = sp.object_id
             AND sp.target_object_id = OBJECT_ID('dbo.Client'))
BEGIN    
    ALTER SECURITY POLICY rls.tenantAccessPolicy
        DROP FILTER PREDICATE ON dbo.Client; 
END;
GO

IF EXISTS( SELECT 1
           FROM sys.security_predicates sp
           WHERE sp.predicate_type = 1 -- block_predicate
             AND OBJECT_ID('rls.tenantAccessPolicy') = sp.object_id
             AND sp.target_object_id = OBJECT_ID('dbo.Client'))
BEGIN
    ALTER SECURITY POLICY rls.tenantAccessPolicy
        DROP BLOCK PREDICATE ON dbo.Client;    
END;
GO
Run Code Online (Sandbox Code Playgroud)