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