Postgresql 中文操作指南

F.22. lo — manage large objects #

lo 模块提供用于管理大对象(也称为 LO 或 BLOB)的支持。其中包括数据类型 lo 和触发器 lo_manage

此模块被认为是“受信任的”,也就是说,它可以由在当前数据库上具有 CREATE 权限的非超级用户安装。

F.22.1. Rationale #

JDBC 驱动程序的一个问题(它也影响 ODBC 驱动程序),是其规范假设对 BLOB(二进制大对象)的引用存储在表中,如果更改该条目,则会从数据库中删除关联的 BLOB。

由于 PostgreSQL 的特性,此问题不会发生。大对象被视为其本身的对象;表条目可以通过 OID 引用大对象,但是有多个表条目可以引用相同的大对象 OID,因此系统不会仅仅因为你更改或删除某个此类条目就删除大对象。

对于 PostgreSQL 特定的应用程序来说这很好,但是使用 JDBC 或 ODBC 的标准代码不会删除对象,从而会导致孤儿对象 - 这些对象不被任何事物引用,而且只占用磁盘空间。

lo 模块允许通过附加触发器到包含 LO 引用列的表来修复它。触发器实际上只在你删除或修改引用大对象的值时执行 lo_unlink。当你使用这个触发器时,你是在假设在触发器控制的列里只存在对任何大对象的 1 个数据库引用!

该模块还提供了一个数据类型 lo ,它实际上只是一个 [role="bare"]glossary.html#GLOSSARY-DOMAIN domain 类型上的 oid 类型。这对于区分存储大对象引用的数据库列与其他对象的 OID 十分有用。你无需使用 lo 类型来使用触发器,但可以使用它来跟踪数据库中的哪些列表示你正使用触发器管理的大对象,这可能会很方便。据传,如果你不使用 lo 来处理 BLOB 列,ODBC 驱动程序会感到困惑。

F.22.2. How to Use It #

下面是一个简单的使用示例:

CREATE TABLE image (title text, raster lo);

CREATE TRIGGER t_raster BEFORE UPDATE OR DELETE ON image
    FOR EACH ROW EXECUTE FUNCTION lo_manage(raster);

对于将包含对大对象的唯一引用的每个列,创建一个 BEFORE UPDATE OR DELETE 触发器,并把列名设为唯一的触发器参数。你还可以使用 BEFORE UPDATE OF column_name 限制触发器仅对列更新执行。如果你需要同一表中的多个 lo 列,为每个列创建一个单独的触发器,记住给同一表上的每个触发器指定不同的名称。

F.22.3. Limitations #

F.22.4. Author #