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.
- {dbt-sqlserver-1.7.4/dbt_sqlserver.egg-info → dbt-sqlserver-1.8.0rc2}/PKG-INFO +5 -5
- {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2}/README.md +3 -3
- {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2}/dbt/adapters/sqlserver/__init__.py +5 -5
- dbt-sqlserver-1.8.0rc2/dbt/adapters/sqlserver/__version__.py +1 -0
- dbt-sqlserver-1.8.0rc2/dbt/adapters/sqlserver/relation_configs/__init__.py +13 -0
- dbt-sqlserver-1.8.0rc2/dbt/adapters/sqlserver/relation_configs/policies.py +25 -0
- dbt-sqlserver-1.8.0rc2/dbt/adapters/sqlserver/sqlserver_adapter.py +61 -0
- dbt-sqlserver-1.8.0rc2/dbt/adapters/sqlserver/sqlserver_column.py +22 -0
- 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
- 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
- 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
- dbt-sqlserver-1.8.0rc2/dbt/adapters/sqlserver/sqlserver_relation.py +51 -0
- {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2}/dbt/include/sqlserver/dbt_project.yml +1 -2
- dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/adapter/columns.sql +25 -0
- dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/adapter/indexes.sql +170 -0
- dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/adapter/metadata.sql +5 -0
- dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/adapter/schemas.sql +5 -0
- dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/adapter/validate_sql.sql +6 -0
- dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/materializations/models/incremental/incremental.sql +97 -0
- dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/materializations/models/table/table.sql +64 -0
- dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/materializations/models/view/view.sql +71 -0
- dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/materializations/snapshot/helpers.sql +35 -0
- dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/materializations/snapshot/snapshot.sql +116 -0
- dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/materializations/snapshot/snapshot_merge.sql +19 -0
- dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/materializations/tests.sql +46 -0
- dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/readme.md +50 -0
- dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/relations/table/create.sql +48 -0
- dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/relations/views/create.sql +19 -0
- {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2}/dbt/include/sqlserver/macros/utils/split_part.sql +1 -1
- dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/profile_template.yml +19 -0
- {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2/dbt_sqlserver.egg-info}/PKG-INFO +5 -5
- dbt-sqlserver-1.8.0rc2/dbt_sqlserver.egg-info/SOURCES.txt +41 -0
- dbt-sqlserver-1.8.0rc2/dbt_sqlserver.egg-info/requires.txt +4 -0
- {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2}/setup.py +6 -6
- dbt-sqlserver-1.7.4/dbt/adapters/sqlserver/__version__.py +0 -1
- dbt-sqlserver-1.7.4/dbt/adapters/sqlserver/sql_server_adapter.py +0 -86
- dbt-sqlserver-1.7.4/dbt/adapters/sqlserver/sql_server_column.py +0 -5
- dbt-sqlserver-1.7.4/dbt/include/sqlserver/macros/adapters/columns.sql +0 -18
- dbt-sqlserver-1.7.4/dbt/include/sqlserver/macros/adapters/indexes.sql +0 -185
- dbt-sqlserver-1.7.4/dbt/include/sqlserver/macros/materializations/models/table/create_table_as.sql +0 -37
- dbt-sqlserver-1.7.4/dbt/include/sqlserver/macros/materializations/snapshots/snapshot.sql +0 -52
- dbt-sqlserver-1.7.4/dbt/include/sqlserver/macros/utils/timestamps.sql +0 -8
- dbt-sqlserver-1.7.4/dbt_sqlserver.egg-info/SOURCES.txt +0 -27
- dbt-sqlserver-1.7.4/dbt_sqlserver.egg-info/requires.txt +0 -4
- {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2}/LICENSE +0 -0
- {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2}/MANIFEST.in +0 -0
- {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2}/dbt/include/sqlserver/__init__.py +0 -0
- {dbt-sqlserver-1.7.4/dbt/include/sqlserver/macros/adapters → dbt-sqlserver-1.8.0rc2/dbt/include/sqlserver/macros/adapter}/relation.sql +0 -0
- {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
- {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
- {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2}/dbt_sqlserver.egg-info/dependency_links.txt +0 -0
- {dbt-sqlserver-1.7.4 → dbt-sqlserver-1.8.0rc2}/dbt_sqlserver.egg-info/top_level.txt +0 -0
- {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.
|
|
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/
|
|
46
|
-
[macOS](https://docs.microsoft.com/
|
|
47
|
-
[Linux](https://docs.microsoft.com/
|
|
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/
|
|
21
|
-
[macOS](https://docs.microsoft.com/
|
|
22
|
-
[Linux](https://docs.microsoft.com/
|
|
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.
|
|
4
|
-
from dbt.adapters.sqlserver.
|
|
5
|
-
from dbt.adapters.sqlserver.
|
|
6
|
-
from dbt.adapters.sqlserver.
|
|
7
|
-
from dbt.adapters.sqlserver.
|
|
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
|
+
]
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
|
|
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.
|
|
20
|
-
|
|
21
|
-
AZURE_AUTH_FUNCTION_TYPE = Callable[[SQLServerCredentials], AccessToken]
|
|
18
|
+
from dbt.adapters.sqlserver.sqlserver_credentials import SQLServerCredentials
|
|
22
19
|
|
|
23
|
-
logger = AdapterLogger("
|
|
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
|
|
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"
|
|
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
|
|
@@ -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 %}
|