我在表空间 T1 中有一个表 X,在表空间 T2 中有一个表 Y。(Oracle DB)
我必须在表空间 T1 中创建一个触发器,在更新表 X 中的列 C 时,更新表 Y(表空间 T2)中的列 D。
因为它们在不同的表空间中,所以我的第一个问题是这可以做到吗?
如果是,那么如何做到这一点?做这样的事情需要什么特权?
我在表空间 T1 中有一个表 X,在表空间 T2 中有一个表 Y。(Oracle DB)
我必须在表空间 T1 中创建一个触发器,在更新表 X 中的列 C 时,更新表 Y(表空间 T2)中的列 D。
因为它们在不同的表空间中,所以我的第一个问题是这可以做到吗?
如果是,那么如何做到这一点?做这样的事情需要什么特权?
它与表空间没有太大关系。但是,您确实需要插入表(以及该特定列)的权限,并且如果表 Y 位于触发器之外的另一个模式中,则需要使用限定表名: 。(在 Oracle 中,模式名是拥有对象的用户名)
CREATE TRIGGER aur_x
AFTER UPDATE OF c ON x
FOR EACH ROW
UPDATE schema_containing_y.Y SET D = ...
;
编辑:
我突然想到你可能不熟悉模式和表空间之间的区别,所以这里有一个简短的解释。表空间是一个逻辑存储容器:它定义了数据文件、增长特征、日志记录类型等。然后,表空间可用于存储与模式对象(表、索引、视图定义,以及包和存储过程定义等)关联的数据。
模式是对象的集合(如表、视图、包等)。这些对象归用户所有,据我所知,在 oracle 中,模式的名称与拥有对象的用户相同。对象依赖于一个或多个表空间提供的存储,但表空间本身不是模式对象。
通常,模式用于对功能相关的对象进行分组(例如,您通常会为一个应用程序创建一个模式)。也可以专门创建表空间来存储一个应用程序的所有对象,但您也可以为具有不同特征的表创建不同的表空间。
通常,应用程序开发人员不应该过多担心表空间。您的 DBA 通常会以方便备份计划之类的方式设置它们。