c# - SQL Server 根据从 C# 控制器传递的参数仅阻止特定表更新
问题描述
在我们的 .net 应用程序中,我们有一个工具允许您在浏览器中键入 SQL 并提交它以进行测试。但是,在这种情况下,我需要能够防止测试人员写入特定的表。因此,基于从控制器传递的参数(InSupportTool = true 或其他),我需要知道是否允许 SQL Server 进行更新或插入,例如,帐户表。
到目前为止我尝试过的事情:
我曾尝试研究触发器,但没有
before
可用的触发器,而且我听说如果你能提供帮助,人们不建议使用它们。解析传递的 SQL 字符串以查找在该表上插入或更新的引用。我敢肯定,这更加脆弱,并且有无数种方法可以绕过它,如果有人愿意的话。
检查约束,这是我觉得我得到的最接近的约束,但我不能把它放在一起。
对于检查约束,我有这个:
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 的熟悉程度有限。
鉴于我想要做的事情,有没有人有这样的经验?谢谢!
解决方案
由于应用程序在与最终用户不同的帐户下运行,您可以在连接字符串中指定您的应用程序名称(例如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
推荐阅读
- java - 重用相同的 awt.Graphics 实例是否比使用 Graphics.create() 创建副本更好?
- delphi - 在 Delphi 中使用 Windows 10 管道时,我得到了中文文本。我如何用英语制作它?
- python - Guarantee that a C program starting at exactly the same time as a Python program will have the same integer time value
- javascript - 如何在 JSON 文件中正确存储 RegEx 值数组并从 Javascript 中检索它?
- apache-spark - Spark:使用线性回归通过 P 值进行反向消除
- java - Java中的序列化顺序
- automation - 所有新项目的 GitLab 默认问题模板
- css - 更改导航栏引导程序
- marklogic - MarkLogic 中的 xdmp:http 模块是否支持 PATCH 请求?
- python - 无法理解最后一行的数组语句