【问题标题】:SQL Server prevent only specific table from updating based on parameter passed from C# controllerSQL Server 根据从 C# 控制器传递的参数仅阻止特定表更新
【发布时间】:2019-06-13 13:17:46
【问题描述】:

在我们的 .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 的熟悉程度有限。

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

【问题讨论】:

  • 您是在征求意见,还是代码有问题?
  • 为什么不为您的工具使用不同的登录名/用户并拒绝更新相关表? SQL 中有丰富的权限模型,可以帮助您执行权限
  • SonalBorkar:我正在寻找以前遇到过类似情况的人的意见,或者如果我很接近我列出的选项之一,我希望得到反馈和正确的推动方向。 @ConorCunninghamMSFT 那么,我可以让传递的 sql 以不同于登录的用户身份运行吗?
  • @JonathanBowman,所以您的应用程序使用的是应用程序帐户而不是最终用户的帐户?将特定于版本的 SQL Server 标记添加到您的问题中。
  • @DanGuzman 添加了版本标签,这是一个我刚刚开始工作的内部应用程序,所以我现在不确定应用程序是否使用自己的帐户来执行sql,或者它是否使用登录用户的权限。我现在正在查看。更新它看起来它在运行之前用于连接的连接字符串使用的用户与登录用户不同,所以也许我可以为这个特定工具设置一个受限的应用程序级别用户?

标签: c# .net sql-server tsql sql-server-2014


【解决方案1】:

由于应用程序在与最终用户不同的帐户下运行,您可以在连接字符串中指定您的应用程序名称(例如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

【讨论】:

  • 哦,我不知道你可以像这样在连接字符串上传递任意参数!我会试一试,看看它是否到达那里并报告。谢谢!
  • 由于这是专门拒绝而不是授予访问权限,因此它会遇到新表默认不受保护的问题。使用sp_settriggerorder 将触发器设置为先触发可能有助于减少副作用,例如来自写入历史日志的触发器。
  • @JonathanBowman,Application Name 连接字符串关键字不是任意的。这是一个正式的SqlClient connection string keyword。我询问该版本的原因是 SQL 2016 引入了 session_context,它确实允许临时键/值对,您可以将其用作替代方案。
猜你喜欢
  • 2015-02-25
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
相关资源
最近更新 更多