簡體   English   中英

檢查 SQL 服務器的謂詞過濾器中是否存在表

[英]Check if Table exists in Predicate Filter in SQL Server

我編寫了一個包含謂詞過濾器的安全策略,以在 SQL 服務器中應用行級安全性。 但是,我只想在表存在於數據庫中時應用過濾謂詞。 任何人都可以請我建議嗎? 以下是安全策略:

IF OBJECT_ID('s.policyName') IS NOT NULL
BEGIN
DROP SECURITY POLICY s.policyName
END
GO  
    CREATE SECURITY POLICY s.policyName 
    ADD  FILTER PREDICATE s.policyName(ColA) ON TableA
    WITH (STATE = ON)       
GO

我確實嘗試在 Filter 謂詞之前和之后添加一個if條件,但它不起作用。 非常感謝任何幫助。

您是否只想在創建策略之前確保表(和列!)存在,而不是每次都對表進行策略檢查? 我不知道您可以刪除具有關聯策略的表(如果必須是模式綁定的策略 function 引用該表,您當然不能),但我認為如果人們可以刪除表政策制定后,還有一個更大的問題。

IF EXISTS 
(
  SELECT 1 FROM sys.tables AS t
    INNER JOIN sys.columns AS c
    ON t.[object_id] = c.[object_id]
    WHERE t.name = N'TableA'
      -- AND t.[schema_id] = SCHEMA_ID(N's') -- 'dbo', 'other' ???
    AND c.name = N'ColA'
)
BEGIN
    CREATE SECURITY POLICY s.policyName 
    ADD  FILTER PREDICATE s.policyFunctionName(ColA) ON TableA
    WITH (STATE = ON);
END

當然,如果表不存在,您一開始就無法創建策略。 它將失敗:

消息 33268,16 級,State 1
找不到 object“TableA”,因為它不存在或您沒有權限。

因此,您可以使用IF EXISTS來獲得良好的行為(您可以在ELSE中放置友好的錯誤消息),或者您可以只包裝TRY/CATCH並希望獲得最好的結果。

您可能還想確保 function s.policyFunctionName存在出於類似的原因(當然您不能將策略稱為與函數相同的策略),或者讓它失敗。

SQL 檢查表是否存在,true 結果為 1,如果表不存在結果為零。 例如:

IF EXISTS ( USE TableA
            SELECT 1 
            FROM INFORMATION_SCHEMA.TABLES 
            WHERE TABLE_TYPE='VIEW' 
            AND TABLE_NAME='TableA') 
   SELECT 1 AS res ELSE SELECT 0 AS res;
  
IF OBJECT_ID ('TableA.s.policyName') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM