在执行之前修改SELECT语句

时间:2020-05-07 08:08:25

标签: sql sql-server

除非明确要求,否则我在一个表中有数据需要阻止访问。 就此而言,假设它是ProductId = 2。

我需要的是一种方法,除非明确请求,否则该方法可以防止对表的查询返回ProductID 2。 因此,如果有人查询

SELECT *
FROM MyTable

我需要一个 WHERE ProductId <> 2 要添加到查询中。

我认为处理此问题的唯一方法是创建一个执行此操作的视图,并使所有查询都通过该视图。但这仍然留有人为错误的余地,我想避免这种情况。

有什么办法吗?

1 个答案:

答案 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;
相关问题