我在table上用Cassandra触发器。我遵循这个示例,用“nodetool reloadtriggers”加载trigger 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查询字符串是可行的。
session.execute(query)
不过,我们在应用程序中的任何地方都在使用boundstatement,不能改变这一点。任何帮助都将不胜感激。
谢谢
暂无答案!
目前还没有任何答案,快来回答吧!