SymmetricDS:我可以使用 initial.load.before.sql 调用存储过程吗

SymmetricDS: Can I call a stored procedure using initial.load.before.sql

我可以在对称-server.properties 中得到“initial.load.before.sql”来向接收节点发送一个简单的SQL 语句。但是 documentation 关于此参数允许的值的内容非常少。

这个有效:

initial.load.before.sql=ALTER TABLE FOO.BAR disable CONSTRAINT BAR_PTY_FK

但我想做的是让 SymmetricDS (SDS) 在初始加载之前在接收节点上执行一个存储过程,以禁用所有外键约束(有很多)。

我尝试在“initial.load.before.sql”中链接几个语句。这也有效:

initial.load.before.sql=ALTER TABLE FOO.BAR disable CONSTRAINT FOO_PTY_FK;ALTER TABLE FOO.BAR disable CONSTRAINT FOO_CTP_FK

但是,如果我包含我需要的所有 FK,“initial.load.before.sql”行会很长。

我试过这样的事情:

initial.load.before.sql=FOO.MY_STORED_PROCEDURE()

但是该值会导致发送节点出现此错误:

2020-10-30 20:34:50,363 ERROR [sds-foo] [ManageIncomingBatchListener] [sds-foo-dataloader-2] Failed to load batch sds-master-1594 StackTraceKey.init [SqlException:2002564836] org.jumpmind.db.sql.SqlException: ORA-00900: invalid SQL statement

不确定存储过程是否完全失效,或者我是否只需要继续调整我为“initial.load.before.sql”提供的值。我尝试了不同类型的 DML SQL 语句(INSERT、UPDATE、DELETE)并且效果很好。 ALTER TABLE 也可以正常工作(只要 SDS Oracle 帐户具有所需的权限)。

如果对答案有帮助,我正在使用 Oracle 并且接收节点上的 SDS 用户数据库帐户具有执行存储过程所需的权限。我可以作为 SDS 用户成功执行存储过程(在 SDS 软件的范围之外......即使用数据库客户端工具,例如 SQLDeveloper)。 SDS的版本是3.12.3.

您能否尝试创建一个存储函数并使用 select 语句调用它,例如

select foo.bar() 来自双重;

?

这应该适用于 Oracle

要调用存储过程,请使用“call”语句,如下所示:

initial.load.before.sql=呼叫FOO.MY_STORED_PROCEDURE()

如果您对在初始加载期间自动延迟索引、约束和外键感兴趣,请查看 auto.create=true 和 initial.load.defer.create.constraints=true 的参数。