Adam Wegscheid
04/27/2026, 8:16 PMhard_delete but that does not work for my use case because record by record deletions are prohibitively expensive for OLAP databases (my target). Plus that would only delete records that are still in the source and we work primarily with sources that allow deletes.
How do others manage this sort of flow when using Meltano as your primary EL tool? I am relatively new to the field (8 years experience), so it may be that this flow is bad practice and there are better ways.Reuben (Matatika)
04/28/2026, 4:22 PMhard_delete some more - I don't think you are limited to record-by-record deletes in the implementation, unless you are saying that is the only way data can be deleted in your database? I would have thought a DROP TABLE or equivalent for selected streams would cover this.
FWIW, I believe the cleanest way is by handling the ACTIVATE_VERSION message, but unfortunately it's not a "one size fits all" solution as both the tap and target would have to support it.Reuben (Matatika)
04/28/2026, 4:31 PMAdam Wegscheid
04/28/2026, 4:36 PMhard_delete , I am never surprised when I misunderstand how an implementation works. When I read it in several taps, my understanding was that it checked for a flag in each record and then the target could delete that record if the flag was set.
Our target is Redshift which is rather ... particular for lack of a better word. It cannot manage individual deletes with any degree of efficiency so that has always been a no-go for us. In addition, tables pretty much need to be permanent fixtures because the Redshift optimizer relies on table stats over time to make its decisions. If you drop the table and then try to query it, it runs magnitudes slower. So, you are left with tables that cannot be replaced and bulk load/truncate operations only.Adam Wegscheid
04/28/2026, 4:38 PMACTIVATE_VERSION! I did explore it briefly but it seemed a tad hacky to be the first route I explored. Eventually I would like to give back to the community with our taps/targets so I am keeping that in mind and trying to avoid non-standard implementations. (Again, I probably just misunderstand the ACTIVATE_VERSION implementation)Reuben (Matatika)
04/28/2026, 8:13 PMhard_delete automatically in the in-built ACTIVATE_VERSION handling logic: https://github.com/meltano/sdk/blob/3365ce6280e9b62437a440771632ffa3ce78ece0/singer_sdk/sql/sink.py#L412-L418 I would assume you can apply the same logic in the setup method of your sink class?Reuben (Matatika)
04/28/2026, 8:16 PMtarget-redshift variants, right? Namely the existing SDK-based default maintained by TicketSwap: https://github.com/TicketSwap/target-redshift Did that not work and was therefore the reason you developed your own?Reuben (Matatika)
04/28/2026, 9:16 PMAdam Wegscheid
04/28/2026, 9:58 PMReuben (Matatika)
04/28/2026, 11:15 PMtarget-snowflake previously where we ended up exposing the required behavioural changes as new settings. That way, they could feasibly be merged back and be made available to all users running into the same issues. I guess if the target contains company-specific logic that can't be made generic in some way, then it wouldn't really be useful as a public variant anyway.