我想结合两个不同的谓词函数。
情况如下:
- 我有第一个谓词函数,它使用配置表(我们称之为 conf_table)来过滤另一个表(TYP_CUSTOMER 列上的 customer_table)。
如果 USER_ID 在部门 'A' (DEPT ='A'),他有权查看客户类型 '1' (TYP_CUSTOMER = '1')
conf_table:
用户身份 | 部门 | 国家 |
---|---|---|
多多 | 一个 | 澳大利亚 |
TITI | 乙 | 印度 |
客户表:
客户ID | TYP_CUSTOMER | 国家 |
---|---|---|
001 | 1 | 澳大利亚 |
002 | 2 | 印度 |
003 | 2 | 澳大利亚 |
004 | 1 | 摩洛哥 |
CREATE FUNCTION dbo.first_predicate_fn(@TYP_CUSTOMER)
RETURNS TABLE
WITH SCHEMABINDING
AS RETURN (SELECT 1 AS RESULT FROM dbo.conf_table c
WHERE c.USER_ID = USER_NAME()
AND (CASE WHEN c.DEPT = 'A' THEN '1' ELSE NULL END = @TYP_CUSTOMER)
GO
CREATE SECURITY POLICY secpol_first
ADD FILTER PREDICATE dbo.first_predicate_fn(TYP_CUSTOMER)
ON dbo.customer_table
WITH (STATE = ON)
USER_ID = 'TOTO' 的预期结果
客户ID | TYP_CUSTOMER | 国家 |
---|---|---|
001 | 1 | 澳大利亚 |
004 | 1 | 摩洛哥 |
- 第二个谓词函数可以过滤同一国家的所有客户。
CREATE FUNCTION dbo.second_predicate_fn(@CUSTOMER_ID)
RETURNS TABLE
WITH SCHEMABINDING
AS RETURN (SELECT 1 AS RESULT FROM dbo.customer_table cust INNER JOIN
dbo.conf_table conf
ON cust.COUNTRY= conf.COUNTRY
WHERE CUSTOMER_ID = @CUSTOMER_ID
GO
CREATE SECURITY POLICY secpol_second
ADD FILTER PREDICATE dbo.second_predicate_fn(CUSTOMER_ID )
ON dbo.customer_table
WITH (STATE = ON)
USER_ID = 'TOTO' 的预期结果
客户ID | TYP_CUSTOMER | 国家 |
---|---|---|
001 | 1 | 澳大利亚 |
003 | 2 | 澳大利亚 |
所以最后,我需要将两者结合起来以获得以下最终结果:
客户ID | TYP_CUSTOMER | 国家 |
---|---|---|
001 | 1 | 澳大利亚 |
003 | 2 | 澳大利亚 |
004 | 1 | 摩洛哥 |
非常感谢您的帮助!