朋友们,
我通过另一个SO问题找到的Ask Tom 线程提到了Table和Transactional API,我试图理解它们之间的区别.
表API(TAPI)是无法访问基础表的地方,并且有"getters"和"setter"来获取信息.
例如,要选择一个地址,我会:
the_address := get_address(address_id);
Run Code Online (Sandbox Code Playgroud)
代替:
select the_address
from some_table
where identifier = address_id
Run Code Online (Sandbox Code Playgroud)
然后要更改地址,我将调用另一个负责更改的TAPI:
...
change_address(address_id, new_address);
...
Run Code Online (Sandbox Code Playgroud)
事务API(XAPI)再次没有直接访问权限来修改表中的信息,但我可以从中进行选择?(这是我的理解有点朦胧的地方)
要选择一个地址我会:
select the_address
from some_table
where identifier = address_id
Run Code Online (Sandbox Code Playgroud)
然后改变它我会打电话
...
change_address(address_id, new_address);
...
Run Code Online (Sandbox Code Playgroud)
因此,我可以在TAPI和XAPI之间看到的唯一区别是从数据库中检索记录的方法,即Select与PL/SQL调用?
是吗?还是我完全错过了这一点?
我正在尝试在视图上编写规则以从组件表中删除元组,但到目前为止只能从其中一个中删除数据.我已经使用了一段时间基本视图的postgres,但我对视图规则没有任何经验.
我写了一个愚蠢的小测试用例来弄清楚/显示我的问题.在这个例子中,每个子元组只有一个父元组(我的实际模式当然不是这样的).
组件表:
CREATE TABLE parent(
id serial PRIMARY KEY,
p_data integer NOT NULL UNIQUE
);
CREATE TABLE child(
id serial PRIMARY KEY,
parent_id integer NOT NULL UNIQUE REFERENCES parent(id),
c_data integer NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
视图:
CREATE TABLE child_view(
id integer,
p_data integer,
c_data integer
);
CREATE RULE "_RETURN" AS ON SELECT TO child_view DO INSTEAD
SELECT child.id, p_data, c_data
FROM parent JOIN child ON (parent_id=parent.id);
Run Code Online (Sandbox Code Playgroud)
问题删除规则
CREATE RULE child_delete AS ON DELETE TO child_view DO INSTEAD(
DELETE FROM child …Run Code Online (Sandbox Code Playgroud)