diff --git a/dbt/adapters/oracle/connections.py b/dbt/adapters/oracle/connections.py index f675ec2..4bbbba3 100644 --- a/dbt/adapters/oracle/connections.py +++ b/dbt/adapters/oracle/connections.py @@ -19,6 +19,7 @@ from dataclasses import dataclass, field import enum import time +import uuid import dbt.exceptions from dbt.adapters.base import Credentials @@ -26,6 +27,7 @@ from dbt.contracts.connection import AdapterResponse from dbt.events import AdapterLogger +from dbt.version import __version__ as dbt_version from dbt.adapters.oracle.connection_helper import oracledb, SQLNET_ORA_CONFIG logger = AdapterLogger("oracle") @@ -177,6 +179,9 @@ def open(cls, connection): try: handle = oracledb.connect(**conn_config) + # client_identifier and module are saved in corresponding columns in v$session + handle.module = f'dbt-{dbt_version}' + handle.client_identifier = f'dbt-oracle-client-{uuid.uuid4()}' connection.handle = handle connection.state = 'open' except oracledb.DatabaseError as e: @@ -270,7 +275,6 @@ def add_query( logger.debug(f'On {connection.name}: f{log_sql}') pre = time.time() - cursor = connection.handle.cursor() cursor.execute(sql, bindings) connection.handle.commit() diff --git a/dbt/include/oracle/macros/adapters.sql b/dbt/include/oracle/macros/adapters.sql index 9afbf76..cdb830b 100644 --- a/dbt/include/oracle/macros/adapters.sql +++ b/dbt/include/oracle/macros/adapters.sql @@ -348,7 +348,7 @@ {% macro oracle__make_temp_relation(base_relation, suffix) %} {% set dt = modules.datetime.datetime.now() %} - {% set dtstring = dt.strftime("%H%M%S") %} + {% set dtstring = dt.strftime("%H%M%S%f") %} {% set tmp_identifier = 'o$pt_' ~ base_relation.identifier ~ dtstring %} {% set tmp_relation = base_relation.incorporate( path={"identifier": tmp_identifier, "schema": None}) -%} diff --git a/dbt/include/oracle/macros/materializations/snapshot/strategies.sql b/dbt/include/oracle/macros/materializations/snapshot/strategies.sql index ea501f3..0350418 100644 --- a/dbt/include/oracle/macros/materializations/snapshot/strategies.sql +++ b/dbt/include/oracle/macros/materializations/snapshot/strategies.sql @@ -98,3 +98,23 @@ {%- endfor -%} {{ return([ns.column_added, intersection]) }} {%- endmacro %} + +{% macro snapshot_timestamp_strategy(node, snapshotted_rel, current_rel, config, target_exists) %} + {% set primary_key = config['unique_key'] %} + {% set updated_at = config['updated_at'] %} + {% set invalidate_hard_deletes = config.get('invalidate_hard_deletes', false) %} + + {% set row_changed_expr -%} + ({{ snapshotted_rel }}.dbt_valid_from < {{ current_rel }}.{{ updated_at }}) + {%- endset %} + {# updated_at should be cast as timestamp because in hash computation "CAST(date as VARCHAR)" truncates time fields #} + {% set scd_id_expr = snapshot_hash_arguments([primary_key, 'CAST(' ~ updated_at ~ ' AS TIMESTAMP)']) %} + + {% do return({ + "unique_key": primary_key, + "updated_at": updated_at, + "row_changed": row_changed_expr, + "scd_id": scd_id_expr, + "invalidate_hard_deletes": invalidate_hard_deletes + }) %} +{% endmacro %} diff --git a/requirements.txt b/requirements.txt index 04fa855..a618e6f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ dbt-core==1.3.1 cx_Oracle==8.3.0 -oracledb==1.2.0 +oracledb==1.2.1 diff --git a/setup.cfg b/setup.cfg index 801fdf1..edb813e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -34,7 +34,7 @@ include_package_data = True install_requires = dbt-core==1.3.1 cx_Oracle==8.3.0 - oracledb==1.2.0 + oracledb==1.2.1 test_suite=tests test_requires = dbt-tests-adapter==1.3.1 diff --git a/setup.py b/setup.py index bed708e..1bca9a6 100644 --- a/setup.py +++ b/setup.py @@ -34,7 +34,7 @@ requirements = [ "dbt-core==1.3.1", "cx_Oracle==8.3.0", - "oracledb==1.2.0" + "oracledb==1.2.1" ] test_requirements = [