diff --git a/lib/ansible/modules/database/postgresql/postgresql_table.py b/lib/ansible/modules/database/postgresql/postgresql_table.py index cf8ee48c6e..101ecb679a 100644 --- a/lib/ansible/modules/database/postgresql/postgresql_table.py +++ b/lib/ansible/modules/database/postgresql/postgresql_table.py @@ -93,6 +93,14 @@ options: - Permissions checking for SQL commands is carried out as though the session_role were the one that had logged in originally. type: str + cascade: + description: + - Automatically drop objects that depend on the table (such as views) + U(https://www.postgresql.org/docs/current/sql-droptable.html). + Used with I(state=absent) only. + type: bool + default: no + version_added: '2.9' notes: - If you do not pass db parameter, tables will be created in the database named postgres. @@ -174,6 +182,12 @@ EXAMPLES = r''' postgresql_table: name: foo state: absent + +- name: Drop table bar cascade + postgresql_table: + name: bar + state: absent + cascade: yes ''' RETURN = r''' @@ -402,8 +416,10 @@ class Table(object): self.executed_queries.append(query) return self.__exec_sql(query, ddl=True) - def drop(self): + def drop(self, cascade=False): query = "DROP TABLE %s" % pg_quote_identifier(self.name, 'table') + if cascade: + query += " CASCADE" self.executed_queries.append(query) return self.__exec_sql(query, ddl=True) @@ -451,6 +467,7 @@ def main(): columns=dict(type='list'), storage_params=dict(type='list'), session_role=dict(type='str'), + cascade=dict(type='bool'), ) module = AnsibleModule( argument_spec=argument_spec, @@ -468,6 +485,10 @@ def main(): storage_params = module.params["storage_params"] truncate = module.params["truncate"] columns = module.params["columns"] + cascade = module.params["cascade"] + + if state == 'present' and cascade: + module.warn("cascade=true is ignored when state=present") # Check mutual exclusive parameters: if state == 'absent' and (truncate or newname or columns or tablespace or @@ -522,7 +543,7 @@ def main(): ) if state == 'absent': - changed = table_obj.drop() + changed = table_obj.drop(cascade=cascade) elif truncate: changed = table_obj.truncate() diff --git a/test/integration/targets/postgresql/tasks/postgresql_table.yml b/test/integration/targets/postgresql/tasks/postgresql_table.yml index 74810b65a7..5291b08155 100644 --- a/test/integration/targets/postgresql/tasks/postgresql_table.yml +++ b/test/integration/targets/postgresql/tasks/postgresql_table.yml @@ -691,3 +691,39 @@ that: - result.rowcount == 1 when: postgres_version_resp.stdout is version('9.1', '>=') + +# Drop table CASCADE: +- name: postgresql_table - drop table cascade + become: yes + become_user: "{{ pg_user }}" + postgresql_table: + db: postgres + login_user: "{{ pg_user }}" + name: test5 + state: absent + cascade: yes + register: result + ignore_errors: yes + +- assert: + that: + - result.changed == true + - result.queries == ['DROP TABLE "test5" CASCADE'] + when: postgres_version_resp.stdout is version('9.1', '>=') + +# Check that the table doesn't exist after the previous step, rowcount must be - 0 +- name: postgresql_table - check that table doesn't exist after the previous step + become_user: "{{ pg_user }}" + become: yes + postgresql_query: + db: postgres + login_user: "{{ pg_user }}" + query: "SELECT 1 FROM pg_stat_all_tables WHERE relname = 'test5'" + ignore_errors: yes + register: result + when: postgres_version_resp.stdout is version('9.1', '>=') + +- assert: + that: + - result.rowcount == 0 + when: postgres_version_resp.stdout is version('9.1', '>=')