--- title: "ALTER PUBLICATION" id: sql-alterpublication pg_version: "20devel" --- # ALTER PUBLICATION — change the definition of a publication ## Synopsis ``` ALTER PUBLICATION name ADD publication_object [, ...] ALTER PUBLICATION name DROP publication_drop_object [, ...] ALTER PUBLICATION name SET { publication_object [, ...] | publication_all_object [, ... ] } ALTER PUBLICATION name SET ( publication_parameter [= value] [, ... ] ) ALTER PUBLICATION name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER PUBLICATION name RENAME TO new_name where publication_object is one of: TABLE table_and_columns [, ... ] TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ] and publication_all_object is one of: ALL TABLES [ EXCEPT ( except_table_object [, ... ] ) ] ALL SEQUENCES and publication_drop_object is one of: TABLE table_object [, ... ] TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ] and table_and_columns is: table_object [ ( column_name [, ... ] ) ] [ WHERE ( expression ) ] and except_table_object is: TABLE table_object [, ... ] and table_object is: [ ONLY ] table_name [ * ] ``` ## Description The command `ALTER PUBLICATION` can change the attributes of a publication. The first two variants modify which tables/schemas are part of the publication. The `ADD` and `DROP` clauses will add and remove one or more tables/schemas from the publication. The third variant either modifies the included tables/schemas or marks the publication as `FOR ALL SEQUENCES` or `FOR ALL TABLES`, optionally using `EXCEPT` to exclude specific tables. The `SET ALL TABLES` clause can transform an empty publication, or one defined for `ALL SEQUENCES` (or both `ALL TABLES` and `ALL SEQUENCES`), into a publication defined for ALL TABLES. Likewise, `SET ALL SEQUENCES` can convert an empty publication, or one defined for `ALL TABLES` (or both `ALL TABLES` and `ALL SEQUENCES`), into a publication defined for `ALL SEQUENCES`. In addition, `SET ALL TABLES` can be used to update the tables specified in the `EXCEPT` clause of a `FOR ALL TABLES` publication. If `EXCEPT` is specified with a list of tables, the existing exclusion list is replaced with the specified tables. If `EXCEPT` is omitted, the existing exclusion list is cleared. The `SET` clause, when used with a publication defined with `FOR TABLE` or `FOR TABLES IN SCHEMA`, replaces the list of tables/schemas in the publication with the specified list; the existing tables or schemas that were present in the publication will be removed. Note that adding tables/except tables/schemas to a publication that is already subscribed to will require an [`ALTER SUBSCRIPTION ... REFRESH PUBLICATION`](sql-altersubscription.md#sql-altersubscription-params-refresh-publication) action on the subscribing side in order to become effective. Likewise altering a publication to set `ALL TABLES` or to set or unset `ALL SEQUENCES` also requires the subscriber to refresh the publication. Note also that `DROP TABLES IN SCHEMA` will not drop any schema tables that were specified using [`FOR TABLE`](sql-createpublication.md#sql-createpublication-params-for-table)/ `ADD TABLE`. The fourth variant of this command listed in the synopsis can change all of the publication properties specified in [CREATE PUBLICATION](sql-createpublication.md). Properties not mentioned in the command retain their previous settings. The remaining variants change the owner and the name of the publication. You must own the publication to use `ALTER PUBLICATION`. Adding a table to a publication additionally requires owning that table. The `ADD TABLES IN SCHEMA`, `SET TABLES IN SCHEMA`, `SET ALL TABLES`, and `SET ALL SEQUENCES` to a publication requires the invoking user to be a superuser. To alter the owner, you must be able to `SET ROLE` to the new owning role, and that role must have `CREATE` privilege on the database. Also, the new owner of a [`FOR TABLES IN SCHEMA`](sql-createpublication.md#sql-createpublication-params-for-tables-in-schema) or [`FOR ALL TABLES`](sql-createpublication.md#sql-createpublication-params-for-all-tables) or [`FOR ALL SEQUENCES`](sql-createpublication.md#sql-createpublication-params-for-all-sequences) publication must be a superuser. However, a superuser can change the ownership of a publication regardless of these restrictions. Adding/Setting any schema when the publication also publishes a table with a column list, and vice versa is not supported. ## Parameters **`name`** The name of an existing publication whose definition is to be altered. **`table_name`** Name of an existing table. If `ONLY` is specified before the table name, only that table is affected. If `ONLY` is not specified, the table and all its descendant tables (if any) are affected. Optionally, `*` can be specified after the table name to explicitly indicate that descendant tables are included. Optionally, a column list can be specified. See [CREATE PUBLICATION](sql-createpublication.md) for details. Note that a subscription having several publications in which the same table has been published with different column lists is not supported. See [Warning: Combining Column Lists from Multiple Publications](logical-replication-col-lists.md#logical-replication-col-list-combining) for details of potential problems when altering column lists. If the optional `WHERE` clause is specified, rows for which the `expression` evaluates to false or null will not be published. Note that parentheses are required around the expression. The `expression` is evaluated with the role used for the replication connection. **`schema_name`** Name of an existing schema. **`SET ( publication_parameter [= value] [, ... ] )`** This clause alters publication parameters originally set by [CREATE PUBLICATION](sql-createpublication.md). See there for more information. This clause is not applicable to sequences. > [!CAUTION] > Altering the `publish_via_partition_root` parameter can lead to data loss or duplication at the subscriber because it changes the identity and schema of the published tables. Note this happens only when a partition root table is specified as the replication target. > This problem can be avoided by refraining from modifying partition leaf tables after the `ALTER PUBLICATION ... SET` until the [`ALTER SUBSCRIPTION ... REFRESH PUBLICATION`](sql-altersubscription.md) is executed and by only refreshing using the `copy_data = off` option. **`new_owner`** The user name of the new owner of the publication. **`new_name`** The new name for the publication. ## Examples Change the publication to publish only deletes and updates: ALTER PUBLICATION noinsert SET (publish = 'update, delete'); Add some tables to the publication: ALTER PUBLICATION mypublication ADD TABLE users (user_id, firstname), departments; Change the set of columns published for a table: ALTER PUBLICATION mypublication SET TABLE users (user_id, firstname, lastname), TABLE departments; Replace the table list in the publication's `EXCEPT` clause: ALTER PUBLICATION mypublication SET ALL TABLES EXCEPT (TABLE users, departments); Reset the publication to be a `FOR ALL TABLES` publication with no excluded tables: ALTER PUBLICATION mypublication SET ALL TABLES; Add schemas marketing and sales to the publication sales_publication: ALTER PUBLICATION sales_publication ADD TABLES IN SCHEMA marketing, sales; Add tables users, departments and schema production to the publication production_publication: ALTER PUBLICATION production_publication ADD TABLE users, departments, TABLES IN SCHEMA production; ## Compatibility `ALTER PUBLICATION` is a PostgreSQL extension. ## See Also [CREATE PUBLICATION](sql-createpublication.md), [DROP PUBLICATION](sql-droppublication.md), [CREATE SUBSCRIPTION](sql-createsubscription.md), [ALTER SUBSCRIPTION](sql-altersubscription.md)