我使用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代码中的update语句激活规则并正确执行更新。那里没有问题。问题在于iRowsAffected
的值,即使行已更新,它也始终为零。
答案 0 :(得分:-1)
您的观点似乎不是documantation定义的“简单”,因此无法更新。
PostgreSQL中的简单视图可自动更新:系统将允许INSERT,UPDATE和DELETE语句以与常规表相同的方式在视图上使用。如果视图满足以下所有条件,则视图可自动更新:
视图必须在其FROM列表中只有一个条目,该条目必须是表或另一个可更新视图。
视图定义不得在顶层包含WITH,DISTINCT,GROUP BY,HAVING,LIMIT或OFFSET子句。
视图定义不得在顶层包含设置操作(UNION,INTERSECT或EXCEPT)。
视图选择列表中的所有列必须是对基础关系列的简单引用。它们不能是表达式,文字或函数。也无法引用系统列。
基础关系的任何列都不能在视图的选择列表中出现多次。
视图不得具有security_barrier属性。
Common Table Expressions将是更好的选择。