仅通过存储过程强制INSERT

时间:2010-03-28 15:50:27

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

使用SQL Server 2008,有没有办法只允许通过存储过程插入表,如果是这样,怎么办?

修改
最好的方法可能是Martin Smith建议使用INSTEAD OF INSERT触发器。这个问题的直接答案是marc_s'与GRANT和DENY合作,但它不会限制某些用户帐户。

4 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:6)

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

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:2)

使用权限(授权)。创建SP并将execute权限授予相关用户或角色。然后拒绝表格中的insert权利,你应该全部设置。