首页 > 解决方案 > SQL Server 根据从 C# 控制器传递的参数仅阻止特定表更新

问题描述

在我们的 .net 应用程序中,我们有一个工具允许您在浏览器中键入 SQL 并提交它以进行测试。但是,在这种情况下,我需要能够防止测试人员写入特定的表。因此,基于从控制器传递的参数(InSupportTool = true 或其他),我需要知道是否允许 SQL Server 进行更新或插入,例如,帐户表。

到目前为止我尝试过的事情:

  1. 我曾尝试研究触发器,但没有before可用的触发器,而且我听说如果你能提供帮助,人们不建议使用它们。

  2. 解析传递的 SQL 字符串以查找在该表上插入或更新的引用。我敢肯定,这更加脆弱,并且有无数种方法可以绕过它,如果有人愿意的话。

  3. 检查约束,这是我觉得我得到的最接近的约束,但我不能把它放在一起。

对于检查约束,我有这个:

ALTER TABLE Accounts WITH NOCHECK 
    ADD CONSTRAINT chk_read_only_accounts CHECK(*somehow this needs to be dynamic based on parameters passed from C# controller*)

上面的方法可以防止更新该表,但前提是我检查了1 = 0. 我看过一篇文章,人们说您可以使用函数作为检查,并以这种方式传递参数,但我对 SQL/.net 的熟悉程度有限。

鉴于我想要做的事情,有没有人有这样的经验?谢谢!

标签: c#.netsql-servertsqlsql-server-2014

解决方案


由于应用程序在与最终用户不同的帐户下运行,您可以在连接字符串中指定您的应用程序名称(例如Application Name=SupportTool)并在后触发器中检查它,根据需要回滚事务:

CREATE TABLE dbo.example(
    col1 int
);
GO

CREATE TRIGGER tr_example
ON dbo.example
AFTER INSERT, UPDATE, DELETE
AS
IF APP_NAME() = N'SupportTool'
BEGIN
    ROLLBACK;
    THROW 50000, 'This update is not allowed using the support tool', 1;
END;
GO

INSERT INTO dbo.example VALUES(1);
GO

推荐阅读