【问题标题】:SQL Server/Oracle table writable only by a trigger?SQL Server/Oracle 表只能由触发器写入?
【发布时间】:2015-01-29 11:27:04
【问题描述】:

我想知道是否有办法使表只能由 SQL Server 或 Oracle DB 中的特定触发器写入。 举个例子:


Table: "Operation"

ID |日期 | Account1_ID | Account2_ID |金额


Table: "Transactions"

ID |日期 |帐户 |债务 |信用


我要确保 Transactions 表只接收来自 Operation 表中的触发器的数据。

有没有办法做到这一点?

【问题讨论】:

  • 您要解决的业务问题是什么?取决于“确保”和“仅”的定义(您是否试图阻止流氓 DBA 编写专门的 insert 语句,向此表添加一行,试图阻止流氓开发人员恶意添加代码到写入此表的过程,试图防止开发人员在触发器之外意外操作表)我们可能会提出技术实现,但可能有更简单的方法来解决潜在问题。
  • @JustinCave 我想防止开发人员意外操作触发器外的表格。这不是在生产中。
  • 在Oracle端,开发者能否以拥有transactions表的用户身份登录数据库?
  • @JustinCave。这是一个假设情况,但是,是的,他们可能能够以该表的所有者身份登录。

标签: sql sql-server oracle triggers readonly


【解决方案1】:

如果您正在寻找在触发器内执行类似alter table TRANSACTIONS read only 的解决方案,您会感到失望,因为您不能在触发器内包含 DDL,因为它会提供隐式提交 (this is a very good thing )。

我想你要回答的真正问题是你真正的意思是只从操作表中的触发器接收数据。您是否害怕其他用户将数据直接插入该表?你的应用程序逻辑是做什么的?它会处理这个吗?

【讨论】:

  • 是的,我想确保在数据库层中,除了在 Operations 表中插入行之外,没有人可以在此表中插入/更新/删除。有没有办法做到这一点?
  • @LeonardoM,我假设这是生产数据,并说为什么有人有能力直接写入表格?如果他们确实立即撤销该能力。如果您还有其他顾虑,请考虑将该表移动到另一个架构中并授予应用程序架构写入权限。
【解决方案2】:

Execute As 允许您创建以不同于当前用户的用户身份运行的触发器。 因此,您可以创建一个对 TRANSACTIONS 表具有写入权限的单独用户,并以该用户身份执行触发器。

如果没有其他用户有写权限,只有触发用户可以修改数据。

当然,您需要确保没有人可以以该用户身份登录,并且您可以信任您的 DBA 来管理该帐户。

【讨论】:

  • 如果它适合您,请接受答案,以便其他人知道这是正确的解决方案。
猜你喜欢
  • 2020-05-09
  • 2017-08-20
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
相关资源
最近更新 更多