我找到了解决办法!我需要使用动态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