【发布时间】:2011-02-01 18:33:42
【问题描述】:
使用 SQL Server 2008,有没有办法只允许通过存储过程向表中插入,如果可以,如何?
编辑:
最好的方法可能是 Martin Smith 建议使用INSTEAD OF INSERT 触发器。这个问题的直接答案是 marc_s 的一个带有 GRANT 和 DENY 的问题,尽管它不会限制某些用户帐户。
【问题讨论】:
标签: tsql sql-server-2008 stored-procedures
使用 SQL Server 2008,有没有办法只允许通过存储过程向表中插入,如果可以,如何?
编辑:
最好的方法可能是 Martin Smith 建议使用INSTEAD OF INSERT 触发器。这个问题的直接答案是 marc_s 的一个带有 GRANT 和 DENY 的问题,尽管它不会限制某些用户帐户。
【问题讨论】:
标签: tsql sql-server-2008 stored-procedures
只是不要授予任何数据库用户(和您的“公共”角色)对表的 INSERT 权限。
授予这些用户执行 INSERT 存储过程的权限 - 这样,他们可以调用存储过程,但不能直接将任何数据插入基础表。
DENY INSERT ON dbo.YourTable TO PUBLIC
GRANT EXECUTE ON dbo.InsertDataProc TO PUBLIC
【讨论】:
The INSERT permission was denied on the object...。我正在使用 SQL 2012。啊,我刚刚了解到这是因为如果 INSERT 是在 proc 内使用动态 SQL 完成的,则此答案将不起作用。
ERROR: permission denied for table user
拒绝INSERT对表的权限,并授予对存储过程的EXECUTE权限。
【讨论】:
提问的动机是什么?是因为存储过程包含某些您在插入数据时依赖执行的逻辑吗?如果是这样,您可能希望使用触发器来封装此逻辑。
如果这不合适,并且您想阻止具有系统管理员权限的人直接插入表,那么您不能,但是您可以使用INSTEAD OF INSERT 确保它不会意外发生引发错误并回滚的触发器,除非设置了某个 CONTEXT_INFO 值,然后清除 CONTEXT_INFO(您的存储过程可以将其设置为预期值)
http://msdn.microsoft.com/en-us/library/aa214382%28SQL.80%29.aspx
【讨论】:
使用权限(授予)。创建 SP 并将 execute 权限授予相关用户或角色。然后拒绝桌面上的insert,你应该已经准备好了。
【讨论】: