我找到了解決辦法!我需要使用動態SQL才能工作,因爲SECURITY POLICY
關鍵字在SELECT
之前執行,或者導致我的錯誤。
此代碼只檢查是否filter
謂詞是存在的,但因爲我總是在同一時間加入filter
和block
,驗證,我無所謂:
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
DECLARE @Sql NVARCHAR(MAX);
SET @Sql = N'ALTER SECURITY POLICY rls.tenantAccessPolicy
DROP FILTER PREDICATE ON dbo.Client,
DROP BLOCK PREDICATE ON dbo.Client'
EXECUTE sp_executesql @Sql
END
ELSE
BEGIN
SET @Sql = N'ALTER SECURITY POLICY rls.tenantAccessPolicy
ADD FILTER PREDICATE rls.fn_tenantAccessPredicateWithSuperUser(CompanyID) ON dbo.Client,
ADD BLOCK PREDICATE rls.fn_tenantAccessPredicateWithSuperUser(CompanyID) ON dbo.Client'
EXECUTE sp_executesql @Sql
END
GO
你確定你正在使用' SQL Server 2014'而不是'SQL Server 2016'? – lad2025
@ lad2025當我做「SELECT @@ VERSION」時,我得到了「Microsoft SQL Azure(RTM) - 12.0.2000.8 Aug 29 2017 13:06:11 Copyright(C)2017 Microsoft Corporation」,它似乎是從SQL Server 2014該網站:https://support.microsoft.com/en-ca/help/321185/how-to-determine-the-version--edition-and-update-level-of-sql-server-a – pikarie