I have multiple databases on the same instance and I am in the process of updating a table schema that must propagate across all the databases.
I am not sure I know what the right procedure for this is but I think it should go a little something like this?
DO $$DECLARE r record;
BEGIN
FOR r IN SELECT datname FROM pg_database WHERE datistemplate = false
LOOP
EXECUTE 'ALTER TABLE public.' || quote_ident(r) || ' ALTER VARCHAR(200);';
EXECUTE ...
END LOOP;
END;
$$;
Any thoughts?
Best Answer
First of all, if you'd be using the data type
text
orvarchar
(without length modifier) instead of the mostly pointlessvarchar(n)
, you wouldn't be in this tight spot to begin with. If you really need to enforce a maximum length, useCHECK
constraints for that, those can be altered without messing with the table structure.More details in this related answer on SO.
Next, you cannot execute SQL command in any other DB than the one you are connected to in standard PostgreSQL at this time. This includes DBs in the same cluster. If you try you get an error like:
To execute SQL commands in other (Postgres) databases, you could install the additional module dblink. I quote the manual here:
Then you can go about refining your
DO
statement withdblink
calls.