[英]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.