dbt-sqlserver 1.7.4__tar.gz → 1.8.0rc2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. {dbt-sqlserver-1.7.4/dbt_sqlserver.egg-info → dbt-sqlserver-1.8.0rc2}/PKG-INFO +5 -5
  2. {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2}/README.md +3 -3
  3. {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2}/dbt/adapters/sqlserver/__init__.py +5 -5
  4. dbt-sqlserver-1.8.0rc2/dbt/adapters/sqlserver/__version__.py +1 -0
  5. dbt-sqlserver-1.8.0rc2/dbt/adapters/sqlserver/relation_configs/__init__.py +13 -0
  6. dbt-sqlserver-1.8.0rc2/dbt/adapters/sqlserver/relation_configs/policies.py +25 -0
  7. dbt-sqlserver-1.8.0rc2/dbt/adapters/sqlserver/sqlserver_adapter.py +61 -0
  8. dbt-sqlserver-1.8.0rc2/dbt/adapters/sqlserver/sqlserver_column.py +22 -0
  9. dbt-sqlserver-1.7.4/dbt/adapters/sqlserver/sql_server_configs.py → dbt-sqlserver-1.8.0rc2/dbt/adapters/sqlserver/sqlserver_configs.py +1 -1
  10. dbt-sqlserver-1.7.4/dbt/adapters/sqlserver/sql_server_connection_manager.py → dbt-sqlserver-1.8.0rc2/dbt/adapters/sqlserver/sqlserver_connections.py +53 -10
  11. dbt-sqlserver-1.7.4/dbt/adapters/sqlserver/sql_server_credentials.py → dbt-sqlserver-1.8.0rc2/dbt/adapters/sqlserver/sqlserver_credentials.py +5 -0
  12. dbt-sqlserver-1.8.0rc2/dbt/adapters/sqlserver/sqlserver_relation.py +51 -0
  13. {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2}/dbt/include/sqlserver/dbt_project.yml +1 -2
  14. dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/adapter/columns.sql +25 -0
  15. dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/adapter/indexes.sql +170 -0
  16. dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/adapter/metadata.sql +5 -0
  17. dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/adapter/schemas.sql +5 -0
  18. dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/adapter/validate_sql.sql +6 -0
  19. dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/materializations/models/incremental/incremental.sql +97 -0
  20. dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/materializations/models/table/table.sql +64 -0
  21. dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/materializations/models/view/view.sql +71 -0
  22. dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/materializations/snapshot/helpers.sql +35 -0
  23. dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/materializations/snapshot/snapshot.sql +116 -0
  24. dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/materializations/snapshot/snapshot_merge.sql +19 -0
  25. dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/materializations/tests.sql +46 -0
  26. dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/readme.md +50 -0
  27. dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/relations/table/create.sql +48 -0
  28. dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/relations/views/create.sql +19 -0
  29. {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2}/dbt/include/sqlserver/macros/utils/split_part.sql +1 -1
  30. dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/profile_template.yml +19 -0
  31. {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2/dbt_sqlserver.egg-info}/PKG-INFO +5 -5
  32. dbt-sqlserver-1.8.0rc2/dbt_sqlserver.egg-info/SOURCES.txt +41 -0
  33. dbt-sqlserver-1.8.0rc2/dbt_sqlserver.egg-info/requires.txt +4 -0
  34. {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2}/setup.py +6 -6
  35. dbt-sqlserver-1.7.4/dbt/adapters/sqlserver/__version__.py +0 -1
  36. dbt-sqlserver-1.7.4/dbt/adapters/sqlserver/sql_server_adapter.py +0 -86
  37. dbt-sqlserver-1.7.4/dbt/adapters/sqlserver/sql_server_column.py +0 -5
  38. dbt-sqlserver-1.7.4/dbt/include/sqlserver/macros/adapters/columns.sql +0 -18
  39. dbt-sqlserver-1.7.4/dbt/include/sqlserver/macros/adapters/indexes.sql +0 -185
  40. dbt-sqlserver-1.7.4/dbt/include/sqlserver/macros/materializations/models/table/create_table_as.sql +0 -37
  41. dbt-sqlserver-1.7.4/dbt/include/sqlserver/macros/materializations/snapshots/snapshot.sql +0 -52
  42. dbt-sqlserver-1.7.4/dbt/include/sqlserver/macros/utils/timestamps.sql +0 -8
  43. dbt-sqlserver-1.7.4/dbt_sqlserver.egg-info/SOURCES.txt +0 -27
  44. dbt-sqlserver-1.7.4/dbt_sqlserver.egg-info/requires.txt +0 -4
  45. {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2}/LICENSE +0 -0
  46. {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2}/MANIFEST.in +0 -0
  47. {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2}/dbt/include/sqlserver/__init__.py +0 -0
  48. {dbt-sqlserver-1.7.4/dbt/include/sqlserver/macros/adapters → dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/adapter}/relation.sql +0 -0
  49. {dbt-sqlserver-1.7.4/dbt/include/sqlserver/macros/materializations → dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/relations}/seeds/helpers.sql +0 -0
  50. {dbt-sqlserver-1.7.4/dbt/include/sqlserver/macros/materializations/models → dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/relations}/table/clone.sql +0 -0
  51. {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2}/dbt_sqlserver.egg-info/dependency_links.txt +0 -0
  52. {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2}/dbt_sqlserver.egg-info/top_level.txt +0 -0
  53. {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2}/setup.cfg +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dbt-sqlserver
3
- Version: 1.7.4
3
+ Version: 1.8.0rc2
4
4
  Summary: A Microsoft SQL Server adapter plugin for dbt
5
5
  Home-page: https://github.com/dbt-msft/dbt-sqlserver
6
- Author: Mikael Ene, Anders Swanson, Sam Debruyn, Cor Zuurmond
6
+ Author: Mikael Ene, Anders Swanson, Sam Debruyn, Cor Zuurmond, Cody Scott
7
7
  License: MIT
8
8
  Project-URL: Setup & configuration, https://docs.getdbt.com/reference/warehouse-profiles/mssql-profile
9
9
  Project-URL: Documentation & usage, https://docs.getdbt.com/reference/resource-configs/mssql-configs
@@ -42,9 +42,9 @@ Join us on the [dbt Slack](https://getdbt.slack.com/archives/CMRMDDQ9W) to ask q
42
42
  ## Installation
43
43
 
44
44
  This adapter requires the Microsoft ODBC driver to be installed:
45
- [Windows](https://docs.microsoft.com/nl-be/sql/connect/odbc/download-odbc-driver-for-sql-server?view=sql-server-ver16#download-for-windows) |
46
- [macOS](https://docs.microsoft.com/nl-be/sql/connect/odbc/linux-mac/install-microsoft-odbc-driver-sql-server-macos?view=sql-server-ver16) |
47
- [Linux](https://docs.microsoft.com/nl-be/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver16)
45
+ [Windows](https://docs.microsoft.com/en-us/sql/connect/odbc/download-odbc-driver-for-sql-server?view=sql-server-ver16#download-for-windows) |
46
+ [macOS](https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/install-microsoft-odbc-driver-sql-server-macos?view=sql-server-ver16) |
47
+ [Linux](https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver16)
48
48
 
49
49
  <details><summary>Debian/Ubuntu</summary>
50
50
  <p>
@@ -17,9 +17,9 @@ Join us on the [dbt Slack](https://getdbt.slack.com/archives/CMRMDDQ9W) to ask q
17
17
  ## Installation
18
18
 
19
19
  This adapter requires the Microsoft ODBC driver to be installed:
20
- [Windows](https://docs.microsoft.com/nl-be/sql/connect/odbc/download-odbc-driver-for-sql-server?view=sql-server-ver16#download-for-windows) |
21
- [macOS](https://docs.microsoft.com/nl-be/sql/connect/odbc/linux-mac/install-microsoft-odbc-driver-sql-server-macos?view=sql-server-ver16) |
22
- [Linux](https://docs.microsoft.com/nl-be/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver16)
20
+ [Windows](https://docs.microsoft.com/en-us/sql/connect/odbc/download-odbc-driver-for-sql-server?view=sql-server-ver16#download-for-windows) |
21
+ [macOS](https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/install-microsoft-odbc-driver-sql-server-macos?view=sql-server-ver16) |
22
+ [Linux](https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver16)
23
23
 
24
24
  <details><summary>Debian/Ubuntu</summary>
25
25
  <p>
@@ -1,10 +1,10 @@
1
1
  from dbt.adapters.base import AdapterPlugin
2
2
 
3
- from dbt.adapters.sqlserver.sql_server_adapter import SQLServerAdapter
4
- from dbt.adapters.sqlserver.sql_server_column import SQLServerColumn
5
- from dbt.adapters.sqlserver.sql_server_configs import SQLServerConfigs
6
- from dbt.adapters.sqlserver.sql_server_connection_manager import SQLServerConnectionManager
7
- from dbt.adapters.sqlserver.sql_server_credentials import SQLServerCredentials
3
+ from dbt.adapters.sqlserver.sqlserver_adapter import SQLServerAdapter
4
+ from dbt.adapters.sqlserver.sqlserver_column import SQLServerColumn
5
+ from dbt.adapters.sqlserver.sqlserver_configs import SQLServerConfigs
6
+ from dbt.adapters.sqlserver.sqlserver_connections import SQLServerConnectionManager # noqa
7
+ from dbt.adapters.sqlserver.sqlserver_credentials import SQLServerCredentials
8
8
  from dbt.include import sqlserver
9
9
 
10
10
  Plugin = AdapterPlugin(
@@ -0,0 +1 @@
1
+ version = "1.8.0rc2"
@@ -0,0 +1,13 @@
1
+ from dbt.adapters.sqlserver.relation_configs.policies import (
2
+ MAX_CHARACTERS_IN_IDENTIFIER,
3
+ SQLServerIncludePolicy,
4
+ SQLServerQuotePolicy,
5
+ SQLServerRelationType,
6
+ )
7
+
8
+ __all__ = [
9
+ "MAX_CHARACTERS_IN_IDENTIFIER",
10
+ "SQLServerIncludePolicy",
11
+ "SQLServerQuotePolicy",
12
+ "SQLServerRelationType",
13
+ ]
@@ -0,0 +1,25 @@
1
+ from dataclasses import dataclass
2
+
3
+ from dbt.adapters.contracts.relation import Policy
4
+ from dbt_common.dataclass_schema import StrEnum
5
+
6
+ MAX_CHARACTERS_IN_IDENTIFIER = 127
7
+
8
+
9
+ class SQLServerRelationType(StrEnum):
10
+ Table = "table"
11
+ View = "view"
12
+ CTE = "cte"
13
+
14
+
15
+ class SQLServerIncludePolicy(Policy):
16
+ database: bool = True
17
+ schema: bool = True
18
+ identifier: bool = True
19
+
20
+
21
+ @dataclass
22
+ class SQLServerQuotePolicy(Policy):
23
+ database: bool = True
24
+ schema: bool = True
25
+ identifier: bool = True
@@ -0,0 +1,61 @@
1
+ from typing import Optional
2
+
3
+ import dbt.exceptions
4
+ from dbt.adapters.base.impl import ConstraintSupport
5
+ from dbt.adapters.fabric import FabricAdapter
6
+ from dbt.contracts.graph.nodes import ConstraintType
7
+
8
+ from dbt.adapters.sqlserver.sqlserver_column import SQLServerColumn
9
+ from dbt.adapters.sqlserver.sqlserver_connections import SQLServerConnectionManager
10
+ from dbt.adapters.sqlserver.sqlserver_relation import SQLServerRelation
11
+
12
+
13
+ class SQLServerAdapter(FabricAdapter):
14
+ """
15
+ Controls actual implmentation of adapter, and ability to override certain methods.
16
+ """
17
+
18
+ ConnectionManager = SQLServerConnectionManager
19
+ Column = SQLServerColumn
20
+ Relation = SQLServerRelation
21
+
22
+ CONSTRAINT_SUPPORT = {
23
+ ConstraintType.check: ConstraintSupport.ENFORCED,
24
+ ConstraintType.not_null: ConstraintSupport.ENFORCED,
25
+ ConstraintType.unique: ConstraintSupport.ENFORCED,
26
+ ConstraintType.primary_key: ConstraintSupport.ENFORCED,
27
+ ConstraintType.foreign_key: ConstraintSupport.ENFORCED,
28
+ }
29
+
30
+ @classmethod
31
+ def render_model_constraint(cls, constraint) -> Optional[str]:
32
+ constraint_prefix = "add constraint "
33
+ column_list = ", ".join(constraint.columns)
34
+
35
+ if constraint.name is None:
36
+ raise dbt.exceptions.DbtDatabaseError(
37
+ "Constraint name cannot be empty. Provide constraint name - column "
38
+ + column_list
39
+ + " and run the project again."
40
+ )
41
+
42
+ if constraint.type == ConstraintType.unique:
43
+ return constraint_prefix + f"{constraint.name} unique nonclustered({column_list})"
44
+ elif constraint.type == ConstraintType.primary_key:
45
+ return constraint_prefix + f"{constraint.name} primary key nonclustered({column_list})"
46
+ elif constraint.type == ConstraintType.foreign_key and constraint.expression:
47
+ return (
48
+ constraint_prefix
49
+ + f"{constraint.name} foreign key({column_list}) references "
50
+ + constraint.expression
51
+ )
52
+ elif constraint.type == ConstraintType.check and constraint.expression:
53
+ return f"{constraint_prefix} {constraint.name} check ({constraint.expression})"
54
+ elif constraint.type == ConstraintType.custom and constraint.expression:
55
+ return f"{constraint_prefix} {constraint.name} {constraint.expression}"
56
+ else:
57
+ return None
58
+
59
+ @classmethod
60
+ def date_function(cls):
61
+ return "getdate()"
@@ -0,0 +1,22 @@
1
+ from dbt.adapters.fabric import FabricColumn
2
+
3
+
4
+ class SQLServerColumn(FabricColumn):
5
+ def is_integer(self) -> bool:
6
+ return self.dtype.lower() in [
7
+ # real types
8
+ "smallint",
9
+ "integer",
10
+ "bigint",
11
+ "smallserial",
12
+ "serial",
13
+ "bigserial",
14
+ # aliases
15
+ "int2",
16
+ "int4",
17
+ "int8",
18
+ "serial2",
19
+ "serial4",
20
+ "serial8",
21
+ "int",
22
+ ]
@@ -5,4 +5,4 @@ from dbt.adapters.fabric import FabricConfigs
5
5
 
6
6
  @dataclass
7
7
  class SQLServerConfigs(FabricConfigs):
8
- ...
8
+ pass
@@ -1,8 +1,9 @@
1
- from typing import Callable, Mapping
2
-
1
+ import dbt_common.exceptions # noqa
3
2
  import pyodbc
4
3
  from azure.core.credentials import AccessToken
5
4
  from azure.identity import ClientSecretCredential, ManagedIdentityCredential
5
+ from dbt.adapters.contracts.connection import Connection, ConnectionState
6
+ from dbt.adapters.events.logging import AdapterLogger
6
7
  from dbt.adapters.fabric import FabricConnectionManager
7
8
  from dbt.adapters.fabric.fabric_connection_manager import (
8
9
  AZURE_AUTH_FUNCTIONS as AZURE_AUTH_FUNCTIONS_FABRIC,
@@ -12,15 +13,11 @@ from dbt.adapters.fabric.fabric_connection_manager import (
12
13
  bool_to_connection_string_arg,
13
14
  get_pyodbc_attrs_before,
14
15
  )
15
- from dbt.contracts.connection import Connection, ConnectionState
16
- from dbt.events import AdapterLogger
17
16
 
18
17
  from dbt.adapters.sqlserver import __version__
19
- from dbt.adapters.sqlserver.sql_server_credentials import SQLServerCredentials
20
-
21
- AZURE_AUTH_FUNCTION_TYPE = Callable[[SQLServerCredentials], AccessToken]
18
+ from dbt.adapters.sqlserver.sqlserver_credentials import SQLServerCredentials
22
19
 
23
- logger = AdapterLogger("SQLServer")
20
+ logger = AdapterLogger("sqlserver")
24
21
 
25
22
 
26
23
  def get_msi_access_token(credentials: SQLServerCredentials) -> AccessToken:
@@ -63,7 +60,7 @@ def get_sp_access_token(credentials: SQLServerCredentials) -> AccessToken:
63
60
  return token
64
61
 
65
62
 
66
- AZURE_AUTH_FUNCTIONS: Mapping[str, AZURE_AUTH_FUNCTION_TYPE] = {
63
+ AZURE_AUTH_FUNCTIONS = {
67
64
  **AZURE_AUTH_FUNCTIONS_FABRIC,
68
65
  "serviceprincipal": get_sp_access_token,
69
66
  "msi": get_msi_access_token,
@@ -73,6 +70,27 @@ AZURE_AUTH_FUNCTIONS: Mapping[str, AZURE_AUTH_FUNCTION_TYPE] = {
73
70
  class SQLServerConnectionManager(FabricConnectionManager):
74
71
  TYPE = "sqlserver"
75
72
 
73
+ # @contextmanager
74
+ # def exception_handler(self, sql: str):
75
+ # """
76
+ # Returns a context manager, that will handle exceptions raised
77
+ # from queries, catch, log, and raise dbt exceptions it knows how to handle.
78
+ # """
79
+ # # ## Example ##
80
+ # # try:
81
+ # # yield
82
+ # # except myadapter_library.DatabaseError as exc:
83
+ # # self.release(connection_name)
84
+
85
+ # # logger.debug("myadapter error: {}".format(str(e)))
86
+ # # raise dbt.exceptions.DatabaseException(str(exc))
87
+ # # except Exception as exc:
88
+ # # logger.debug("Error running SQL: {}".format(sql))
89
+ # # logger.debug("Rolling back transaction.")
90
+ # # self.release(connection_name)
91
+ # # raise dbt.exceptions.RuntimeException(str(exc))
92
+ # pass
93
+
76
94
  @classmethod
77
95
  def open(cls, connection: Connection) -> Connection:
78
96
  if connection.state == ConnectionState.OPEN:
@@ -112,7 +130,7 @@ class SQLServerConnectionManager(FabricConnectionManager):
112
130
 
113
131
  plugin_version = __version__.version
114
132
  application_name = f"dbt-{credentials.type}/{plugin_version}"
115
- con_str.append(f"Application Name={application_name}")
133
+ con_str.append(f"APP={application_name}")
116
134
 
117
135
  con_str_concat = ";".join(con_str)
118
136
 
@@ -156,3 +174,28 @@ class SQLServerConnectionManager(FabricConnectionManager):
156
174
  retry_limit=credentials.retries,
157
175
  retryable_exceptions=retryable_exceptions,
158
176
  )
177
+
178
+ # @classmethod
179
+ # def get_response(cls,cursor):
180
+ # """
181
+ # Gets a cursor object and returns adapter-specific information
182
+ # about the last executed command generally a AdapterResponse ojbect
183
+ # that has items such as code, rows_affected,etc. can also just be a string ex. "OK"
184
+ # if your cursor does not offer rich metadata.
185
+ # """
186
+ # # ## Example ##
187
+ # # return cursor.status_message
188
+ # pass
189
+
190
+ # def cancel(self, connection):
191
+ # """
192
+ # Gets a connection object and attempts to cancel any ongoing queries.
193
+ # """
194
+ # # ## Example ##
195
+ # # tid = connection.handle.transaction_id()
196
+ # # sql = "select cancel_transaction({})".format(tid)
197
+ # # logger.debug("Cancelling query "{}" ({})".format(connection_name, pid))
198
+ # # _, cursor = self.add_query(sql, "master")
199
+ # # res = cursor.fetchone()
200
+ # # logger.debug("Canceled query "{}": {}".format(connection_name, res))
201
+ # pass
@@ -6,6 +6,11 @@ from dbt.adapters.fabric import FabricCredentials
6
6
 
7
7
  @dataclass
8
8
  class SQLServerCredentials(FabricCredentials):
9
+ """
10
+ Defines database specific credentials that get added to
11
+ profiles.yml to connect to new adapter
12
+ """
13
+
9
14
  port: Optional[int] = 1433
10
15
  authentication: Optional[str] = "sql"
11
16
 
@@ -0,0 +1,51 @@
1
+ from dataclasses import dataclass, field
2
+ from typing import Optional, Type
3
+
4
+ from dbt.adapters.base.relation import BaseRelation
5
+ from dbt.adapters.utils import classproperty
6
+ from dbt_common.exceptions import DbtRuntimeError
7
+
8
+ from dbt.adapters.sqlserver.relation_configs import (
9
+ MAX_CHARACTERS_IN_IDENTIFIER,
10
+ SQLServerIncludePolicy,
11
+ SQLServerQuotePolicy,
12
+ SQLServerRelationType,
13
+ )
14
+
15
+
16
+ @dataclass(frozen=True, eq=False, repr=False)
17
+ class SQLServerRelation(BaseRelation):
18
+ type: Optional[SQLServerRelationType] = None # type: ignore
19
+ include_policy: SQLServerIncludePolicy = field(
20
+ default_factory=lambda: SQLServerIncludePolicy()
21
+ )
22
+ quote_policy: SQLServerQuotePolicy = field(default_factory=lambda: SQLServerQuotePolicy())
23
+
24
+ @classproperty
25
+ def get_relation_type(cls) -> Type[SQLServerRelationType]:
26
+ return SQLServerRelationType
27
+
28
+ def render_limited(self) -> str:
29
+ rendered = self.render()
30
+ if self.limit is None:
31
+ return rendered
32
+ elif self.limit == 0:
33
+ return f"(select * from {rendered} where 1=0) {self._render_limited_alias()}"
34
+ else:
35
+ return f"(select TOP {self.limit} * from {rendered}) {self._render_limited_alias()}"
36
+
37
+ def __post_init__(self):
38
+ # Check for length of Redshift table/view names.
39
+ # Check self.type to exclude test relation identifiers
40
+ if (
41
+ self.identifier is not None
42
+ and self.type is not None
43
+ and len(self.identifier) > MAX_CHARACTERS_IN_IDENTIFIER
44
+ ):
45
+ raise DbtRuntimeError(
46
+ f"Relation name '{self.identifier}' "
47
+ f"is longer than {MAX_CHARACTERS_IN_IDENTIFIER} characters"
48
+ )
49
+
50
+ def relation_max_name_length(self):
51
+ return MAX_CHARACTERS_IN_IDENTIFIER
@@ -1,6 +1,5 @@
1
1
  name: dbt_sqlserver
2
- version: 1.0
3
-
2
+ version: 1.8.0
4
3
  config-version: 2
5
4
 
6
5
  macro-paths: ["macros"]
@@ -0,0 +1,25 @@
1
+ {% macro sqlserver__alter_column_type(relation, column_name, new_column_type) %}
2
+
3
+ {%- set tmp_column = column_name + "__dbt_alter" -%}
4
+ {% set alter_column_type %}
5
+ alter {{ relation.type }} {{ relation }} add "{{ tmp_column }}" {{ new_column_type }};
6
+ {%- endset %}
7
+
8
+ {% set update_column %}
9
+ update {{ relation }} set "{{ tmp_column }}" = "{{ column_name }}";
10
+ {%- endset %}
11
+
12
+ {% set drop_column %}
13
+ alter {{ relation.type }} {{ relation }} drop column "{{ column_name }}";
14
+ {%- endset %}
15
+
16
+ {% set rename_column %}
17
+ exec sp_rename '{{ relation | replace('"', '') }}.{{ tmp_column }}', '{{ column_name }}', 'column'
18
+ {%- endset %}
19
+
20
+ {% do run_query(alter_column_type) %}
21
+ {% do run_query(update_column) %}
22
+ {% do run_query(drop_column) %}
23
+ {% do run_query(rename_column) %}
24
+
25
+ {% endmacro %}
@@ -0,0 +1,170 @@
1
+ {% macro sqlserver__create_clustered_columnstore_index(relation) -%}
2
+ {%- set cci_name = (relation.schema ~ '_' ~ relation.identifier ~ '_cci') | replace(".", "") | replace(" ", "") -%}
3
+ {%- set relation_name = relation.schema ~ '_' ~ relation.identifier -%}
4
+ {%- set full_relation = '"' ~ relation.schema ~ '"."' ~ relation.identifier ~ '"' -%}
5
+ use [{{ relation.database }}];
6
+ if EXISTS (
7
+ SELECT *
8
+ FROM sys.indexes {{ information_schema_hints() }}
9
+ WHERE name = '{{cci_name}}'
10
+ AND object_id=object_id('{{relation_name}}')
11
+ )
12
+ DROP index {{full_relation}}.{{cci_name}}
13
+ CREATE CLUSTERED COLUMNSTORE INDEX {{cci_name}}
14
+ ON {{full_relation}}
15
+ {% endmacro %}
16
+
17
+ {% macro drop_xml_indexes() -%}
18
+ {{ log("Running drop_xml_indexes() macro...") }}
19
+
20
+ declare @drop_xml_indexes nvarchar(max);
21
+ select @drop_xml_indexes = (
22
+ select 'IF INDEXPROPERTY(' + CONVERT(VARCHAR(MAX), sys.tables.[object_id]) + ', ''' + sys.indexes.[name] + ''', ''IndexId'') IS NOT NULL DROP INDEX [' + sys.indexes.[name] + '] ON ' + '[' + SCHEMA_NAME(sys.tables.[schema_id]) + '].[' + OBJECT_NAME(sys.tables.[object_id]) + ']; '
23
+ from sys.indexes {{ information_schema_hints() }}
24
+ inner join sys.tables {{ information_schema_hints() }}
25
+ on sys.indexes.object_id = sys.tables.object_id
26
+ where sys.indexes.[name] is not null
27
+ and sys.indexes.type_desc = 'XML'
28
+ and sys.tables.[name] = '{{ this.table }}'
29
+ for xml path('')
30
+ ); exec sp_executesql @drop_xml_indexes;
31
+ {%- endmacro %}
32
+
33
+
34
+ {% macro drop_spatial_indexes() -%}
35
+ {# Altered from https://stackoverflow.com/q/1344401/10415173 #}
36
+ {# and https://stackoverflow.com/a/33785833/10415173 #}
37
+
38
+ {{ log("Running drop_spatial_indexes() macro...") }}
39
+
40
+ declare @drop_spatial_indexes nvarchar(max);
41
+ select @drop_spatial_indexes = (
42
+ select 'IF INDEXPROPERTY(' + CONVERT(VARCHAR(MAX), sys.tables.[object_id]) + ', ''' + sys.indexes.[name] + ''', ''IndexId'') IS NOT NULL DROP INDEX [' + sys.indexes.[name] + '] ON ' + '[' + SCHEMA_NAME(sys.tables.[schema_id]) + '].[' + OBJECT_NAME(sys.tables.[object_id]) + ']; '
43
+ from sys.indexes {{ information_schema_hints() }}
44
+ inner join sys.tables {{ information_schema_hints() }}
45
+ on sys.indexes.object_id = sys.tables.object_id
46
+ where sys.indexes.[name] is not null
47
+ and sys.indexes.type_desc = 'Spatial'
48
+ and sys.tables.[name] = '{{ this.table }}'
49
+ for xml path('')
50
+ ); exec sp_executesql @drop_spatial_indexes;
51
+ {%- endmacro %}
52
+
53
+
54
+ {% macro drop_fk_constraints() -%}
55
+ {# Altered from https://stackoverflow.com/q/1344401/10415173 #}
56
+
57
+ {{ log("Running drop_fk_constraints() macro...") }}
58
+
59
+ declare @drop_fk_constraints nvarchar(max);
60
+ select @drop_fk_constraints = (
61
+ select 'IF OBJECT_ID(''' + SCHEMA_NAME(CONVERT(VARCHAR(MAX), sys.foreign_keys.[schema_id])) + '.' + sys.foreign_keys.[name] + ''', ''F'') IS NOT NULL ALTER TABLE [' + SCHEMA_NAME(sys.foreign_keys.[schema_id]) + '].[' + OBJECT_NAME(sys.foreign_keys.[parent_object_id]) + '] DROP CONSTRAINT [' + sys.foreign_keys.[name]+ '];'
62
+ from sys.foreign_keys
63
+ inner join sys.tables on sys.foreign_keys.[referenced_object_id] = sys.tables.[object_id]
64
+ where sys.tables.[name] = '{{ this.table }}'
65
+ for xml path('')
66
+ ); exec sp_executesql @drop_fk_constraints;
67
+
68
+ {%- endmacro %}
69
+
70
+
71
+ {% macro drop_pk_constraints() -%}
72
+ {# Altered from https://stackoverflow.com/q/1344401/10415173 #}
73
+ {# and https://stackoverflow.com/a/33785833/10415173 #}
74
+
75
+ {{ drop_xml_indexes() }}
76
+
77
+ {{ drop_spatial_indexes() }}
78
+
79
+ {{ drop_fk_constraints() }}
80
+
81
+ {{ log("Running drop_pk_constraints() macro...") }}
82
+
83
+ declare @drop_pk_constraints nvarchar(max);
84
+ select @drop_pk_constraints = (
85
+ select 'IF INDEXPROPERTY(' + CONVERT(VARCHAR(MAX), sys.tables.[object_id]) + ', ''' + sys.indexes.[name] + ''', ''IndexId'') IS NOT NULL ALTER TABLE [' + SCHEMA_NAME(sys.tables.[schema_id]) + '].[' + sys.tables.[name] + '] DROP CONSTRAINT [' + sys.indexes.[name]+ '];'
86
+ from sys.indexes
87
+ inner join sys.tables on sys.indexes.[object_id] = sys.tables.[object_id]
88
+ where sys.indexes.is_primary_key = 1
89
+ and sys.tables.[name] = '{{ this.table }}'
90
+ for xml path('')
91
+ ); exec sp_executesql @drop_pk_constraints;
92
+
93
+ {%- endmacro %}
94
+
95
+
96
+ {% macro drop_all_indexes_on_table() -%}
97
+ {# Altered from https://stackoverflow.com/q/1344401/10415173 #}
98
+ {# and https://stackoverflow.com/a/33785833/10415173 #}
99
+
100
+ {{ drop_pk_constraints() }}
101
+
102
+ {{ log("Dropping remaining indexes...") }}
103
+
104
+ declare @drop_remaining_indexes_last nvarchar(max);
105
+ select @drop_remaining_indexes_last = (
106
+ select 'IF INDEXPROPERTY(' + CONVERT(VARCHAR(MAX), sys.tables.[object_id]) + ', ''' + sys.indexes.[name] + ''', ''IndexId'') IS NOT NULL DROP INDEX [' + sys.indexes.[name] + '] ON ' + '[' + SCHEMA_NAME(sys.tables.[schema_id]) + '].[' + OBJECT_NAME(sys.tables.[object_id]) + ']; '
107
+ from sys.indexes {{ information_schema_hints() }}
108
+ inner join sys.tables {{ information_schema_hints() }}
109
+ on sys.indexes.object_id = sys.tables.object_id
110
+ where sys.indexes.[name] is not null
111
+ and SCHEMA_NAME(sys.tables.schema_id) = '{{ this.schema }}'
112
+ and sys.tables.[name] = '{{ this.table }}'
113
+ for xml path('')
114
+ ); exec sp_executesql @drop_remaining_indexes_last;
115
+
116
+ {%- endmacro %}
117
+
118
+
119
+ {% macro create_clustered_index(columns, unique=False) -%}
120
+ {{ log("Creating clustered index...") }}
121
+
122
+ {% set idx_name = "clustered_" + local_md5(columns | join("_")) %}
123
+
124
+ if not exists(select *
125
+ from sys.indexes {{ information_schema_hints() }}
126
+ where name = '{{ idx_name }}'
127
+ and object_id = OBJECT_ID('{{ this }}')
128
+ )
129
+ begin
130
+
131
+ create
132
+ {% if unique -%}
133
+ unique
134
+ {% endif %}
135
+ clustered index
136
+ {{ idx_name }}
137
+ on {{ this }} ({{ '[' + columns|join("], [") + ']' }})
138
+ end
139
+ {%- endmacro %}
140
+
141
+
142
+ {% macro create_nonclustered_index(columns, includes=False) %}
143
+
144
+ {{ log("Creating nonclustered index...") }}
145
+
146
+ {% if includes -%}
147
+ {% set idx_name = (
148
+ "nonclustered_"
149
+ + local_md5(columns | join("_"))
150
+ + "_incl_"
151
+ + local_md5(includes | join("_"))
152
+ ) %}
153
+ {% else -%}
154
+ {% set idx_name = "nonclustered_" + local_md5(columns | join("_")) %}
155
+ {% endif %}
156
+
157
+ if not exists(select *
158
+ from sys.indexes {{ information_schema_hints() }}
159
+ where name = '{{ idx_name }}'
160
+ and object_id = OBJECT_ID('{{ this }}')
161
+ )
162
+ begin
163
+ create nonclustered index
164
+ {{ idx_name }}
165
+ on {{ this }} ({{ '[' + columns|join("], [") + ']' }})
166
+ {% if includes -%}
167
+ include ({{ '[' + includes|join("], [") + ']' }})
168
+ {% endif %}
169
+ end
170
+ {% endmacro %}
@@ -0,0 +1,5 @@
1
+ {% macro apply_label() %}
2
+ {{ log (config.get('query_tag','dbt-sqlserver'))}}
3
+ {%- set query_label = config.get('query_tag','dbt-sqlserver') -%}
4
+ OPTION (LABEL = '{{query_label}}');
5
+ {% endmacro %}
@@ -0,0 +1,5 @@
1
+
2
+ {% macro sqlserver__drop_schema_named(schema_name) %}
3
+ {% set schema_relation = api.Relation.create(schema=schema_name) %}
4
+ {{ adapter.drop_schema(schema_relation) }}
5
+ {% endmacro %}
@@ -0,0 +1,6 @@
1
+ {% macro sqlserver__validate_sql(sql) -%}
2
+ {% call statement('validate_sql') -%}
3
+ {{ sql }}
4
+ {% endcall %}
5
+ {{ return(load_result('validate_sql')) }}
6
+ {% endmacro %}