【问题标题】:Force INSERT only via stored procedure仅通过存储过程强制插入
【发布时间】:2011-02-01 18:33:42
【问题描述】:

使用 SQL Server 2008,有没有办法只允许通过存储过程向表中插入,如果可以,如何?

编辑:
最好的方法可能是 Martin Smith 建议使用INSTEAD OF INSERT 触发器。这个问题的直接答案是 marc_s 的一个带有 GRANT 和 DENY 的问题,尽管它不会限制某些用户帐户。

【问题讨论】:

标签: tsql sql-server-2008 stored-procedures


【解决方案1】:

只是不要授予任何数据库用户(和您的“公共”角色)对表的 INSERT 权限。

授予这些用户执行 INSERT 存储过程的权限 - 这样,他们可以调用存储过程,但不能直接将任何数据插入基础表。

DENY INSERT ON dbo.YourTable TO PUBLIC
GRANT EXECUTE ON dbo.InsertDataProc TO PUBLIC

【讨论】:

  • 这是唯一方式...假设连接不是db_owner或sysadmin...
  • 这对我不起作用。即使我正在执行执行 INSERT 的存储过程,我也会得到 The INSERT permission was denied on the object...。我正在使用 SQL 2012。啊,我刚刚了解到这是因为如果 INSERT 是在 proc 内使用动态 SQL 完成的,则此答案将不起作用。
  • 对我不起作用,得到ERROR: permission denied for table user
【解决方案2】:

拒绝INSERT对表的权限,并授予对存储过程的EXECUTE权限。

【讨论】:

    【解决方案3】:

    提问的动机是什么?是因为存储过程包含某些您在插入数据时依赖执行的逻辑吗?如果是这样,您可能希望使用触发器来封装此逻辑。

    如果这不合适,并且您想阻止具有系统管理员权限的人直接插入表,那么您不能,但是您可以使用INSTEAD OF INSERT 确保它不会意外发生引发错误并回滚的触发器,除非设置了某个 CONTEXT_INFO 值,然后清除 CONTEXT_INFO(您的存储过程可以将其设置为预期值)

    http://msdn.microsoft.com/en-us/library/aa214382%28SQL.80%29.aspx

    【讨论】:

      【解决方案4】:

      使用权限(授予)。创建 SP 并将 execute 权限授予相关用户或角色。然后拒绝桌面上的insert,你应该已经准备好了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-10
        相关资源
        最近更新 更多