我撰寫了一個安全策略,其中包含一個謂詞過濾器以在 SQL Server 中應用行級安全性。但是,我只想在表存在于資料庫中時應用過濾謂詞。任何人都可以請我建議嗎?以下是安全策略:
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
我確實嘗試if在 Filter 謂詞之前和之后添加一個條件,但它不起作用。非常感謝任何幫助。
uj5u.com熱心網友回復:
您是否只想在創建策略之前確保表(和列!)存在,而不是每次都對表進行策略檢查?我不知道你可以洗掉一個與它關聯的策略的表(如果策略函式必須是模式系結的,你當然不能參考該表),但我認為如果人們可以洗掉表政策制定后,還有一個更大的問題。
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,狀態 1
找不到物件“TableA”,因為它不存在或您沒有權限。
因此,您可以使用IF EXISTSfor nice 行為(您可以在 中放置友好的錯誤訊息ELSE),或者您可以換TRY/CATCH行并希望最好。
您可能還想確保該函式s.policyFunctionName出于類似原因而存在(當然,您不能將策略稱為與該函式相同的策略),或者只是讓它失敗。
uj5u.com熱心網友回復:
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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/410817.html
標籤:
上一篇:插入值后出現截斷錯誤
