【问题标题】:What is the best way to permanently mark a record as read-only?将记录永久标记为只读的最佳方法是什么?
【发布时间】:2010-10-20 20:46:51
【问题描述】:

我有一个连接到 SQL Server 2000 机器的 Access 2003 应用程序。

我有一个表,我需要在其中锁定一条记录以及不同表中的所有相关记录。 “锁定”是指将它们标记为只读,这样除非管理员解锁,否则任何客户都无法编辑这些记录。

有什么想法吗?

【问题讨论】:

  • “锁定”是什么意思?永久阻止更改它?或者在您对其进行操作时防止其他人在短时间内更改?
  • 更多的是永久锁定。一旦锁定,最终用户应该无法编辑记录。但是,管理员需要有一种方法来解锁它。目前,我的主表中有一个隐藏位字段,当记录被锁定时会被设置,但我无法确定锁定相关记录的最佳方式。
  • 我已经编辑了这个问题,以明确您的意思是永久锁定。阅读本文的某些人会认为您的意思是行级临时锁。我希望这可以帮助您获得更好的答案。
  • “主”记录是 Access 还是 SQL Server?如果主记录在 ms 访问中,则基于触发器的解决方案将更加困难。
  • 所有记录都驻留在 Access 中。我锁定表单的 Access 解决方案会更好吗?

标签: sql sql-server ms-access vba


【解决方案1】:

很可能在数据库级别没有“优雅”的方式来执行此操作。但是有几条路线你可以做。

  1. 为每个表添加一个“锁定”位字段,并在“锁定”父级时将该值级联。
  2. 结合#1添加更新和删除触发器,如果​​设置了标志,您可以取消更新或删除。

这是我能想到的在数据库级别执行它的唯一真正简单的方法。

【讨论】:

    【解决方案2】:

    假设您的数据在 SQL Server 中,如果可能,我会首先使用 SQL Server 安全性。我们通常不允许对表进行任何访问,然后通过 SP 对其进行控制。 SP 可以有更复杂的逻辑来确定是否应该执行特定操作。

    如果这不是一个选项,您始终可以使用触发器,检查行并以这种方式拒绝更新或删除。

    有很多方法可以给这只猫剥皮。

    【讨论】:

      【解决方案3】:

      只是另一种选择:

      • 将 last_updated 列添加到您的 表,由更新更新 触发
      • 创建一个表 Locked_Widgets(或其他),它只是基表的 PK 和 last_updated 列,整组列构成 Locked_Widgets 中的 PK
      • 将基表中的非级联外键放入 Locked_Widgets

      如果有人尝试更新行,触发器将尝试更新 last_updated 列,外键约束将导致更新失败。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-13
        • 2011-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多