我在桌上使用Cassandra触发器。我正在跟踪示例,并使用“ nodetool reloadtriggers”加载触发器jar。然后我正在使用
'CREATE TRIGGER mytrigger ON ..'
来自cqlsh的命令在我的表上创建触发器。 在该表中添加一个条目,将填充我的审计表。 但是从我的Java应用程序中调用一个方法,该方法通过使用将一个条目持久化到我的表 'session.execute(BoundStatement)'我得到了这个例外:
InvalidQueryException: table of additional mutation does not match primary update table
为什么直接使用cqlsh进行插入到表中并进行审核,为什么在使用Java应用程序执行几乎完全相同时却失败?
我将其用作AuditTrigger,非常简化(省略了除行插入之外的所有其他操作:
public class AuditTrigger implements ITrigger {
private Properties properties = loadProperties();
public Collection<Mutation> augment(Partition update) {
String auditKeyspace = properties.getProperty("keyspace");
String auditTable = properties.getProperty("table");
CFMetaData metadata = Schema.instance.getCFMetaData(auditKeyspace,
auditTable);
PartitionUpdate.SimpleBuilder audit =
PartitionUpdate.simpleBuilder(metadata, UUIDGen.getTimeUUID());
if (row.primaryKeyLivenessInfo().timestamp() != Long.MIN_VALUE) {
// Row Insertion
JSONObject obj = new JSONObject();
obj.put("message_id", update.metadata().getKeyValidator()
.getString(update.partitionKey().getKey()));
audit.row().add("operation", "ROW INSERTION");
}
audit.row().add("keyspace_name", update.metadata().ksName)
.add("table_name", update.metadata().cfName)
.add("primary_key", update.metadata().getKeyValidator()
.getString(update.partitionKey()
.getKey()));
return Collections.singletonList(audit.buildAsMutation());
似乎使用BoundStatement,触发失败:
session.execute(boundStatement);
,但是使用常规的cql queryString可以工作。
session.execute(query)
虽然我们在应用程序中的任何地方都使用Boundstatement,但不能更改它。 任何帮助将不胜感激。
谢谢