【发布时间】:2019-06-13 13:17:46
【问题描述】:
在我们的 .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 的熟悉程度有限。
鉴于我想要做的事情,有没有人有这样的经验?谢谢!
【问题讨论】:
-
您是在征求意见,还是代码有问题?
-
为什么不为您的工具使用不同的登录名/用户并拒绝更新相关表? SQL 中有丰富的权限模型,可以帮助您执行权限
-
SonalBorkar:我正在寻找以前遇到过类似情况的人的意见,或者如果我很接近我列出的选项之一,我希望得到反馈和正确的推动方向。 @ConorCunninghamMSFT 那么,我可以让传递的 sql 以不同于登录的用户身份运行吗?
-
@JonathanBowman,所以您的应用程序使用的是应用程序帐户而不是最终用户的帐户?将特定于版本的 SQL Server 标记添加到您的问题中。
-
@DanGuzman 添加了版本标签,这是一个我刚刚开始工作的内部应用程序,所以我现在不确定应用程序是否使用自己的帐户来执行sql,或者它是否使用登录用户的权限。我现在正在查看。更新它看起来它在运行之前用于连接的连接字符串使用的用户与登录用户不同,所以也许我可以为这个特定工具设置一个受限的应用程序级别用户?
标签: c# .net sql-server tsql sql-server-2014