【问题标题】:trigger to update object in different tablespace触发更新不同表空间中的对象
【发布时间】:2010-01-29 13:13:57
【问题描述】:

我有一个表 X 在表空间 T1 和一个表 Y 在表空间 T2。(Oracle DB

我必须在表空间 T1 中创建一个触发器, 在更新表 X 中的 C 列时, 更新表 Y(表空间 T2)中的 D 列。

因为它们在不同的表空间中,所以我的第一个问题是这可以做到吗?

如果是,那怎么办?做这样的事情需要什么权限?

【问题讨论】:

  • “表空间”实际上是指“模式”吗?

标签: oracle10g triggers tablespace


【解决方案1】:

它与表空间没有太大关系。但是,您确实需要插入表(以及该特定列)的权限,并且如果表 Y 位于触发器之外的另一个模式中,则需要使用限定表名: 。 (在 Oracle 中,schemaname 是拥有该对象的用户的名称)

CREATE TRIGGER aur_x
AFTER UPDATE OF c ON x
FOR EACH ROW
UPDATE schema_containing_y.Y SET D = ...
;

编辑:
我突然想到你可能不熟悉模式和表空间之间的区别,所以这里有一个简短的解释。表空间是一个逻辑存储容器:它定义了数据文件、增长特征、日志记录类型等。然后,表空间可用于存储与模式对象(表、索引、视图定义,以及包和存储过程定义等)关联的数据。

模式是对象的集合(如表、视图、包等)。这些对象由用户拥有,据我所知,在 oracle 中,模式的名称与拥有对象。对象依赖于一个或多个表空间提供的存储,但表空间本身不是模式对象。

通常,架构用于对功能相关的对象进行分组(例如,您通常会为一个应用程序创建一个架构)。也可以专门创建表空间来存储一个应用程序的所有对象,但您也可以为具有不同特征的表创建不同的表空间。

通常,应用程序开发人员不应该过多担心表空间。您的 DBA 通常会以方便备份计划之类的方式设置它们。

【讨论】:

  • Roland,首先感谢您在这么短的时间内回复。但是,您的解决方案并没有解决问题。情况是 X 和 Y(来自我的示例)位于不同的表空间(也不同的网络模式并属于不同的用户)但在同一个数据库实例上,触发器,您如何定义它,不起作用。也许我必须获得授权才能从另一个表空间中的触发器更新一个表空间中的表。
  • milostrivun:请参阅我回答的第二句:“您确实需要权限来插入表(以及该特定列)” - 我写的是 INSERT 而不是 UPDATE,我的错。关于表空间:就像指出的那样,只要您对表具有适当的权限,oracle 就不会关心表在哪个表空间中。只有在其中创建表时才需要表空间的权限。
  • 知道了!这是关于特权,当我正确设置它们时它起作用了!再次感谢罗兰!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 2020-06-21
  • 2017-02-16
  • 2011-12-22
  • 2019-11-17
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多