【问题标题】:How to prevent database user deleting data from ALL tables by triggers如何防止数据库用户通过触发器从所有表中删除数据
【发布时间】:2011-06-07 04:54:53
【问题描述】:

嗨专家 如何防止数据库用户使用触发器删除表中的任何数据? 我只想管理员从表中删除数据

谢谢

【问题讨论】:

    标签: sql sql-server sql-server-2005 sql-server-2008 triggers


    【解决方案1】:

    您想使用触发器有什么特别的原因吗?

    您可以简单地从您要限制的用户中删除 DELETE 权限。在此处查看“权限”部分:http://msdn.microsoft.com/en-us/library/ms189835.aspx

    编辑:既然你说你确实想使用触发器(但我真的认为你应该重新考虑)你可以创建一个表,例如:

    CREATE TABLE Restricted_Users 
    (
      user_name VARCHAR(40) PRIMARY_KEY -- Use a size appropriate to your requirements
    )
    

    所有你的表上创建INSTEAD OF DELETE触发器(这将是一件苦差事),它检查Restricted_Users表中的USER_NAME(),如果它们EXIST你可以调用@ 987654328@ 使事务回滚并向用户显示消息。

    请记住,您必须在添加到数据库的所有新表上维护这些触发器,并在您从数据库中添加/删除用户时维护Restricted_Users 表中的用户列表。

    很多使用 SQL Server 中可用的权限系统(这是它的设计目的)使用为表设置了适当权限的角色会更简单。然后,在添加新用户时,您只需将他们分配给适当的角色,并为您处理删除权限。

    【讨论】:

    • 在这种情况下,您必须设置一个您想要防止删除数据的用户表。在触发器查找中,USER_NAME() 执行删除以了解您是否应该回滚操作。
    • @Nima 你能解释一下为什么要使用触发器吗?与仅设置所需权限相比,它的效率和安全性较低。
    • @Nima:如果您使用的是 SQL Server 2005 或更高版本,您可以使用过程sys.dm_exec_connections 来获取client_net_address,但这仅在您使用 TCP 连接到您的服务器时才有效(我思考)。这是该过程的 BOL 页面的链接:msdn.microsoft.com/en-us/library/ms181509.aspx
    【解决方案2】:

    嗯,取消该用户的权限?如果您不希望他们做某事,请“禁止”他们这样做……这就是我们拥有权限的原因。

    以下是有关如何撤销权限的详细信息:

    http://msdn.microsoft.com/en-us/library/ms186308.aspx

    【讨论】:

    • 正确答案,但您链接到 MySQL 文档,问题标记为 SQL Server :)
    • 糟糕.. 已更正,实际上我在发布后快速编辑以添加参考。
    猜你喜欢
    • 2010-12-04
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多