除非明确要求,否则我在一个表中有数据需要阻止访问。 就此而言,假设它是ProductId = 2。
我需要的是一种方法,除非明确请求,否则该方法可以防止对表的查询返回ProductID 2。 因此,如果有人查询
SELECT *
FROM MyTable
我需要一个
WHERE ProductId <> 2
要添加到查询中。
我认为处理此问题的唯一方法是创建一个执行此操作的视图,并使所有查询都通过该视图。但这仍然留有人为错误的余地,我想避免这种情况。
有什么办法吗?
答案 0 :(得分:-1)
根据您的澄清,在SQL 2016+中可以实现行级安全性,但是,听起来简单的解决方案是使用ProductID作为输入参数创建存储过程,然后使用IF ... THEN逻辑来完成你的目标。我正在提供一个基本示例,但是您必须在逻辑中构建适当的复杂度才能实现目标,例如,也许您一次需要传递多个ProductID,等等。
CREATE PROCEDURE dbo.uspGetProductsFromMyTable
@ProductID INT = NULL
AS
SET NOCOUNT ON;
IF @ProductID <> 2
BEGIN;
SELECT * FROM MyTable
WHERE ProductID <> 2
AND (@ProductID IS NULL OR ProductID = @ProductID);
END;
IF @ProductID = 2
BEGIN;
SELECT * FROM MyTable
WHERE ProductID = 2
AND (@ProductID IS NULL OR ProductID = @ProductID);
END;