Re: How to drop a subscription inside a stored procedure? - Mailing list pgsql-general

From Adrian Klaver
Subject Re: How to drop a subscription inside a stored procedure?
Date
Msg-id df9a3d36-25a4-d8a4-ae4c-8f2b6f6e49a9@aklaver.com
Whole thread Raw
In response to How to drop a subscription inside a stored procedure?  (Thomas Kellerer <shammat@gmx.net>)
Responses Re: How to drop a subscription inside a stored procedure?
List pgsql-general
On 6/10/22 05:57, Thomas Kellerer wrote:
> I am trying to write a stored procedure (Postgres 13) to enable
> non-superusers to re-create a subscription.
> 

> However, the "drop subscription" part results in this error:
> 
>      ERROR:  DROP SUBSCRIPTION cannot be executed from a function
>      CONTEXT:  SQL statement "drop subscription if exists my_replication"
> 
> I first thought that the initial SELECT to fetch all replicated tables,
> starts an implicit transaction, so I removed everything else from the procedure,
> including the dynamic SQL.
> 
> But even this very simple implementation:
> 
>      create or replace procedure drop_subscription()
>      as
>      $$
>      begin
>        drop subscription if exists test_subscription;
>      end;
>      $$
>      security definer
>      language plpgsql;
> 
> 
> fails with that error.
> 
> Is there any way, I can provide a stored procedure to do this?

 From the docs:

https://www.postgresql.org/docs/current/sql-dropsubscription.html

"DROP SUBSCRIPTION cannot be executed inside a transaction block if the 
subscription is associated with a replication slot. (You can use ALTER 
SUBSCRIPTION to unset the slot.)"

I have not tested but you might try the ALTER SUBSCRIPTION first, though 
note the caveats here:

https://www.postgresql.org/docs/current/sql-altersubscription.html

> 
> Regards
> Thomas
> 
> 


-- 
Adrian Klaver
adrian.klaver@aklaver.com



pgsql-general by date:

Previous
From: Thomas Kellerer
Date:
Subject: How to drop a subscription inside a stored procedure?
Next
From: Nitesh Nathani
Date:
Subject: multiple entries for synchronous_standby_names