From de620df64e9a063e71462520663dc8e53ba5da08 Mon Sep 17 00:00:00 2001 From: panasenco Date: Wed, 17 Feb 2021 13:08:02 -0800 Subject: [PATCH] Adding USE [{{relation.database}}] where appropriate in adapters.sql Fixes #110. I messed with `adapters.sql` until changing databases became possible. Did a little bit of refactoring while I was at it... I couldn't figure out how to run the unit tests so hoping the CI will reject the PR if something's wrong with it... --- CHANGELOG.md | 5 +++ dbt/adapters/sqlserver/__version__.py | 2 +- dbt/include/sqlserver/macros/adapters.sql | 54 +++++++++++------------ 3 files changed, 31 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e9183f4..22efa97e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +### v0.19.0.2 + +#### fixes +- changing databases is now supported. [#110](https://github.com/dbt-msft/dbt-sqlserver/issues/110) + ### v0.19.0.1 #### fixes diff --git a/dbt/adapters/sqlserver/__version__.py b/dbt/adapters/sqlserver/__version__.py index 32ffcdd5..8f0c3a67 100644 --- a/dbt/adapters/sqlserver/__version__.py +++ b/dbt/adapters/sqlserver/__version__.py @@ -1 +1 @@ -version = '0.19.0.1' \ No newline at end of file +version = '0.19.0.2' diff --git a/dbt/include/sqlserver/macros/adapters.sql b/dbt/include/sqlserver/macros/adapters.sql index 65bb5c8a..8e6aacac 100644 --- a/dbt/include/sqlserver/macros/adapters.sql +++ b/dbt/include/sqlserver/macros/adapters.sql @@ -72,31 +72,16 @@ {% endmacro %} {% macro sqlserver__drop_relation(relation) -%} - {% if relation.type == 'view' -%} - {% set object_id_type = 'V' %} - {% elif relation.type == 'table'%} - {% set object_id_type = 'U' %} - {%- else -%} invalid target name - {% endif %} - {% call statement('drop_relation', auto_begin=False) -%} - if object_id ('{{ relation.include(database=False) }}','{{ object_id_type }}') is not null - begin - drop {{ relation.type }} {{ relation.include(database=False) }} - end + {% call statement('drop_relation', auto_begin=False) %} + USE [{{ relation.database }}] + DROP VIEW IF EXISTS {{ relation.include(database=False) }} + DROP TABLE IF EXISTS {{ relation.include(database=False) }} {%- endcall %} {% endmacro %} {% macro sqlserver__drop_relation_script(relation) -%} - {% if relation.type == 'view' -%} - {% set object_id_type = 'V' %} - {% elif relation.type == 'table'%} - {% set object_id_type = 'U' %} - {%- else -%} invalid target name - {% endif %} - if object_id ('{{ relation.include(database=False) }}','{{ object_id_type }}') is not null - begin - drop {{ relation.type }} {{ relation.include(database=False) }} - end + DROP VIEW IF EXISTS {{ relation.include(database=False) }} + DROP TABLE IF EXISTS {{ relation.include(database=False) }} {% endmacro %} {% macro sqlserver__check_schema_exists(information_schema, schema) -%} @@ -107,14 +92,26 @@ {{ return(load_result('check_schema_exists').table) }} {% endmacro %} -{% macro sqlserver__create_view_as(relation, sql) -%} - create view {{ relation.schema }}.{{ relation.identifier }} as - {{ sql }} +{% macro sqlserver__create_view_exec(relation, sql) -%} + {%- set temp_view_sql = sql.replace("'", "''") -%} + + EXEC('create view {{ relation.schema }}.{{ relation.identifier }} as + {{ temp_view_sql }} + '); {% endmacro %} +{% macro sqlserver__create_view_as(relation, sql) -%} + USE [{{ relation.database }}] + {{ sqlserver__create_view_exec(relation, sql) }} +{% endmacro %} {% macro sqlserver__rename_relation(from_relation, to_relation) -%} {% call statement('rename_relation') -%} + {% if from_relation.database != to_relation.database %} + {{ exceptions.raise_compiler_error("Can't do cross-database rename {} -> {}".format(from_relation, to_relation)) }} + {% endif %} + USE [{{ from_relation.database }}] + {{ sqlserver__drop_relation_script(to_relation) }} EXEC sp_rename '{{ from_relation.schema }}.{{ from_relation.identifier }}', '{{ to_relation.identifier }}' IF EXISTS( SELECT * @@ -143,15 +140,14 @@ {% set tmp_relation = relation.incorporate( path={"identifier": relation.identifier.replace("#", "") ~ '_temp_view'}, type='view')-%} - {%- set temp_view_sql = sql.replace("'", "''") -%} + USE [{{ relation.database }}] + {{ sqlserver__drop_relation_script(tmp_relation) }} {{ sqlserver__drop_relation_script(relation) }} - - EXEC('create view {{ tmp_relation.schema }}.{{ tmp_relation.identifier }} as - {{ temp_view_sql }} - '); + + {{ sqlserver__create_view_exec(tmp_relation, sql) }} SELECT * INTO {{ relation.schema }}.{{ relation.identifier }} FROM {{ tmp_relation.schema }}.{{ tmp_relation.identifier }}