【问题标题】:Dblink Insert Update Delete - Number of rows affected always zeroDblink 插入更新删除 - 受影响的行数始终为零
【发布时间】:2014-06-22 12:48:09
【问题描述】:

我正在使用dblink 对远程数据库进行一些数据操作(插入、更新或删除)。具体来说,我正在使用视图和视图规则来执行插入、更新或删除。例如:

-- SQL
-- Note: get_remote_db() is a function returning the connection string

CREATE VIEW remote_table AS
SELECT * FROM dblink(get_remote_db(), 'SELECT id, name FROM example_table')
AS rec(id NUMERIC, name VARCHAR);

CREATE RULE remote_table_update AS
ON UPDATE TO remote_table DO INSTEAD
SELECT dblink_exec(
    get_remote_db(),
    concat('UPDATE example_table SET name = ', quote_nullable(NEW.name),
        ' WHERE id = ', quote_nullable(OLD.id)),
    true);
// Java

String SQL = "UPDATE remote_table SET name = 'John' WHERE id = 23";
int iRowsAffected = statement.executeUpdate(SQL);
if (iRowsAffected > 0) {
    System.out.println("Rows affected: " + iRowsAffected);
} else {
    System.out.println("No rows affected!");
}

我发现在使用dblink_exec时,受影响的行数始终为零,即使在远程数据库中,某些行(多于零)也会受到影响。

有什么解决方法吗?我的应用程序的某些部分取决于受影响的行数。如果数字始终为零,则应用程序将无法按预期工作。

澄清: Java 代码中的更新语句激活规则并正确执行更新。那里没有问题。问题在于 iRowsAffected 的值,即使更新了一行,它也始终为零。

【问题讨论】:

    标签: java postgresql postgresql-9.1 sql-view dblink


    【解决方案1】:

    您的视图似乎不是documantation 定义的“简单”,因此无法更新。

    简单视图可以自动更新:系统将允许在视图上使用 INSERT、UPDATE 和 DELETE 语句,就像在常规表上一样。如果满足以下所有条件,则视图会自动更新:

    视图的 FROM 列表中必须有一个条目,该条目必须是表或另一个可更新视图。

    视图定义不得在顶层包含 WITH、DISTINCT、GROUP BY、HAVING、LIMIT 或 OFFSET 子句。

    视图定义不得在顶层包含集合操作(​​UNION、INTERSECT 或 EXCEPT)。

    视图选择列表中的所有列都必须是对基础关系列的简单引用。它们不能是表达式、文字或函数。也不能引用系统列。

    基础关系的任何列都不能在视图的选择列表中出现多次。

    视图不得具有 security_barrier 属性。

    Common Table Expressions 在 PostgreSQL 中会是更好的选择。

    【讨论】:

    • 视图是可更新的。我在问题中提到正在进行更改。问题不在于我不能更新视图——我可以。问题是受影响的行数总是返回为零,这是不正确的。所以你的回答没有回答我的问题。
    • 另外,使用的数据库是 9.1,其中简单视图不可更新。可更新视图仅在 9.3 中引入。您关于任何不简单的视图都不可更新的笼统陈述也是错误的。复杂视图不是自动可更新的,但可以使用触发器或规则手动更新它们(如果你注意到了,我使用了规则)。最后,我不知道 CTE 应该如何在这里提供帮助 - 它们似乎与手头的问题完全无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 2015-05-31
    • 2019-11-20
    • 2017-05-06
    • 2014-11-17
    相关资源
    最近更新 更多