Elastic Microsoft SQL 连接器参考

编辑

Elastic Microsoft SQL 连接器 是一个用于 Microsoft SQL 数据库的 连接器。此连接器使用 Elastic 连接器框架用 Python 编写。

查看此连接器的源代码(分支 8.17,与 Elastic 8.17 兼容)。

Elastic 托管连接器参考

编辑
查看Elastic 托管连接器参考
可用性和先决条件
编辑

此连接器在 Elastic 版本 8.8.0 及更高版本中作为托管连接器提供。要在 Elastic Cloud 中本地使用此连接器,请满足所有托管连接器要求

创建 Microsoft SQL 连接器
编辑

使用 UI

编辑

要创建新的 Microsoft SQL 连接器

  1. 在 Kibana UI 中,从主菜单导航到 搜索 → 内容 → 连接器 页面,或使用全局搜索字段
  2. 按照说明创建新的原生 Microsoft SQL 连接器。

有关其他操作,请参阅Kibana 中的连接器 UI

使用 API

编辑

您可以使用 Elasticsearch 创建连接器 API 创建新的原生 Microsoft SQL 连接器。

例如

resp = client.connector.put(
    connector_id="my-{service-name-stub}-connector",
    index_name="my-elasticsearch-index",
    name="Content synced from {service-name}",
    service_type="{service-name-stub}",
    is_native=True,
)
print(resp)
const response = await client.connector.put({
  connector_id: "my-{service-name-stub}-connector",
  index_name: "my-elasticsearch-index",
  name: "Content synced from {service-name}",
  service_type: "{service-name-stub}",
  is_native: true,
});
console.log(response);
PUT _connector/my-mssql-connector
{
  "index_name": "my-elasticsearch-index",
  "name": "Content synced from Microsoft SQL",
  "service_type": "mssql",
  "is_native": true
}
您还需要创建一个 API 密钥供连接器使用。

用户需要集群权限 manage_api_keymanage_connectorwrite_connector_secrets 以编程方式生成 API 密钥。

要为连接器创建 API 密钥

  1. 运行以下命令,替换指示的值。请注意响应中返回的 idencoded

    resp = client.security.create_api_key(
        name="my-connector-api-key",
        role_descriptors={
            "my-connector-connector-role": {
                "cluster": [
                    "monitor",
                    "manage_connector"
                ],
                "indices": [
                    {
                        "names": [
                            "my-index_name",
                            ".search-acl-filter-my-index_name",
                            ".elastic-connectors*"
                        ],
                        "privileges": [
                            "all"
                        ],
                        "allow_restricted_indices": False
                    }
                ]
            }
        },
    )
    print(resp)
    const response = await client.security.createApiKey({
      name: "my-connector-api-key",
      role_descriptors: {
        "my-connector-connector-role": {
          cluster: ["monitor", "manage_connector"],
          indices: [
            {
              names: [
                "my-index_name",
                ".search-acl-filter-my-index_name",
                ".elastic-connectors*",
              ],
              privileges: ["all"],
              allow_restricted_indices: false,
            },
          ],
        },
      },
    });
    console.log(response);
    POST /_security/api_key
    {
      "name": "my-connector-api-key",
      "role_descriptors": {
        "my-connector-connector-role": {
          "cluster": [
            "monitor",
            "manage_connector"
          ],
          "indices": [
            {
              "names": [
                "my-index_name",
                ".search-acl-filter-my-index_name",
                ".elastic-connectors*"
              ],
              "privileges": [
                "all"
              ],
              "allow_restricted_indices": false
            }
          ]
        }
      }
    }
  2. 使用 encoded 值存储连接器密钥,并注意此响应中返回的 id

    resp = client.connector.secret_post(
        body={
            "value": "encoded_api_key"
        },
    )
    print(resp)
    const response = await client.connector.secretPost({
      body: {
        value: "encoded_api_key",
      },
    });
    console.log(response);
    POST _connector/_secret
    {
      "value": "encoded_api_key"
    }
  3. 使用 API 密钥 id 和连接器密钥 id 来更新连接器

    resp = client.connector.update_api_key_id(
        connector_id="my_connector_id>",
        api_key_id="API key_id",
        api_key_secret_id="secret_id",
    )
    print(resp)
    const response = await client.connector.updateApiKeyId({
      connector_id: "my_connector_id>",
      api_key_id: "API key_id",
      api_key_secret_id: "secret_id",
    });
    console.log(response);
    PUT /_connector/my_connector_id>/_api_key_id
    {
      "api_key_id": "API key_id",
      "api_key_secret_id": "secret_id"
    }

有关所有可用连接器 API 的详细信息,请参阅Elasticsearch API 文档

用法
编辑

要将此连接器用作托管连接器,请使用连接器工作流程。请参阅Elastic 托管连接器

用户需要 sysadmin SQL Server 角色。请注意,需要 SQL Server 身份验证。不支持 Windows 身份验证。

有关其他操作,请参阅Kibana 中的连接器 UI

兼容性
编辑

以下与 Elastic 连接器框架兼容

  • Microsoft SQL Server 版本 2017、2019
  • Azure SQL
  • 适用于 SQL Server 的 Amazon RDS
配置
编辑

设置连接器需要以下配置字段

主机

托管 Microsoft SQL Server 的服务器主机地址。默认值为 127.0.0.1。示例

  • 192.158.1.38
  • demo.instance.demo-region.demo.service.com
端口
托管 Microsoft SQL Server 的端口。默认值为 1433
用户名
Microsoft SQL Server 帐户的用户名(仅限 SQL Server 身份验证)。
密码
要用于 Microsoft SQL Server 的帐户的密码(仅限 SQL Server 身份验证)。
数据库

Microsoft SQL Server 数据库的名称。示例

  • employee_database
  • customer_database
逗号分隔的表列表

以逗号分隔的表列表。如果值为 *,Microsoft SQL 连接器将从配置的数据库中获取所有表中的数据。默认值为 *。示例

  • table_1, table_2
  • *

    此字段可以通过高级同步规则绕过。

架构

Microsoft SQL Server 架构的名称。默认值为 dbo

示例

  • dbo
  • custom_schema
启用 SSL
切换以启用 SSL 验证。默认值为 False
SSL 证书

SSL 证书的内容。如果禁用 SSL,将忽略 ssl_ca 值。

展开以查看证书示例
-----BEGIN CERTIFICATE-----
MIID+jCCAuKgAwIBAgIGAJJMzlxLMA0GCSqGSIb3DQEBCwUAMHoxCzAJBgNVBAYT
...
7RhLQyWn2u00L7/9Omw=
-----END CERTIFICATE-----
验证主机
切换以启用主机验证。默认值为 False
文档和同步
编辑
  • 将跳过未定义主键的表。
  • 如果特定表和数据库的 sys.dm_db_index_usage_stats 表的 last_user_update 不可用,则将同步该表中的所有数据。
  • 不会提取大于 10 MB 的文件。
  • 权限不会同步。索引到 Elastic 部署的所有文档将对所有具有访问权限的用户可见。
同步规则
编辑

基本同步规则 对于所有连接器都是相同的,并且默认可用。有关更多信息,请阅读同步规则

高级同步规则
编辑

此连接器支持用于远程过滤的高级同步规则。这些规则涵盖无法用基本同步规则表达的复杂查询和筛选场景。高级同步规则通过特定于源的 DSL JSON 代码片段定义。

需要完全同步,高级同步规则才能生效。

以下是此连接器的一些高级同步规则示例。

展开以查看示例数据

employee

emp_id 姓名 年龄

3

John

28

10

Jane

35

14

Alex

22

* customer

c_id 姓名 年龄

2

Elm

24

6

Pine

30

9

Oak

34

示例:两个查询

这些规则从 employeecustomer 表中获取所有记录。这些表中的数据将分别同步到 Elasticsearch。

[
  {
    "tables": [
      "employee"
    ],
    "query": "SELECT * FROM employee"
  },
  {
    "tables": [
      "customer"
    ],
    "query": "SELECT * FROM customer"
  }
]

示例:一个 WHERE 查询

此规则仅从 emp_id 大于 5 的 employee 表中获取记录。只有这些经过筛选的记录才会同步到 Elasticsearch。

[
  {
    "tables": ["employee"],
    "query": "SELECT * FROM employee WHERE emp_id > 5"
  }
]

示例:一个 JOIN 查询

此规则通过在 employee 中的 emp_idcustomer 中的 c_id 匹配的条件下,在 employeecustomer 表之间执行 INNER JOIN 来获取记录。此组合数据的结果将同步到 Elasticsearch。

[
  {
    "tables": ["employee", "customer"],
    "query": "SELECT * FROM employee INNER JOIN customer ON employee.emp_id = customer.c_id"
  }
]

使用高级规则时,查询可以绕过配置字段 tables。如果查询指定了未出现在配置中的表,则会发生这种情况。如果配置指定 * 以获取所有表,而高级同步规则仅请求部分表,也可能发生这种情况。

已知问题
编辑

此连接器没有已知问题。有关影响所有连接器的任何问题,请参阅已知问题

故障排除
编辑

请参阅故障排除

安全性
编辑

请参阅安全性

此连接器使用 通用数据库连接器源代码(分支 8.17,与 Elastic 8.17 兼容)。

查看 特定于此数据源的其他代码(分支 8.17,与 Elastic 8.17 兼容)。

自管理连接器

编辑
查看 自管理连接器 参考
可用性和先决条件
编辑

此连接器作为自管理 自管理连接器 提供。要使用此连接器,请满足所有自管理连接器要求

创建 Microsoft SQL 连接器
编辑

使用 UI

编辑

要创建新的 Microsoft SQL 连接器

  1. 在 Kibana UI 中,从主菜单导航到 搜索 → 内容 → 连接器 页面,或使用全局搜索字段
  2. 按照说明创建新的 Microsoft SQL 自管理连接器。

使用 API

编辑

您可以使用 Elasticsearch 创建连接器 API 来创建一个新的自管理 Microsoft SQL 自管理连接器。

例如

resp = client.connector.put(
    connector_id="my-{service-name-stub}-connector",
    index_name="my-elasticsearch-index",
    name="Content synced from {service-name}",
    service_type="{service-name-stub}",
)
print(resp)
const response = await client.connector.put({
  connector_id: "my-{service-name-stub}-connector",
  index_name: "my-elasticsearch-index",
  name: "Content synced from {service-name}",
  service_type: "{service-name-stub}",
});
console.log(response);
PUT _connector/my-mssql-connector
{
  "index_name": "my-elasticsearch-index",
  "name": "Content synced from Microsoft SQL",
  "service_type": "mssql"
}
您还需要创建一个 API 密钥供连接器使用。

用户需要集群权限 manage_api_keymanage_connectorwrite_connector_secrets 以编程方式生成 API 密钥。

要为连接器创建 API 密钥

  1. 运行以下命令,替换指示的值。注意来自响应的 encoded 返回值

    resp = client.security.create_api_key(
        name="connector_name-connector-api-key",
        role_descriptors={
            "connector_name-connector-role": {
                "cluster": [
                    "monitor",
                    "manage_connector"
                ],
                "indices": [
                    {
                        "names": [
                            "index_name",
                            ".search-acl-filter-index_name",
                            ".elastic-connectors*"
                        ],
                        "privileges": [
                            "all"
                        ],
                        "allow_restricted_indices": False
                    }
                ]
            }
        },
    )
    print(resp)
    const response = await client.security.createApiKey({
      name: "connector_name-connector-api-key",
      role_descriptors: {
        "connector_name-connector-role": {
          cluster: ["monitor", "manage_connector"],
          indices: [
            {
              names: [
                "index_name",
                ".search-acl-filter-index_name",
                ".elastic-connectors*",
              ],
              privileges: ["all"],
              allow_restricted_indices: false,
            },
          ],
        },
      },
    });
    console.log(response);
    POST /_security/api_key
    {
      "name": "connector_name-connector-api-key",
      "role_descriptors": {
        "connector_name-connector-role": {
          "cluster": [
            "monitor",
            "manage_connector"
          ],
          "indices": [
            {
              "names": [
                "index_name",
                ".search-acl-filter-index_name",
                ".elastic-connectors*"
              ],
              "privileges": [
                "all"
              ],
              "allow_restricted_indices": false
            }
          ]
        }
      }
    }
  2. 使用 API 密钥 encoded 值更新您的 config.yml 文件。

有关所有可用连接器 API 的详细信息,请参阅Elasticsearch API 文档

用法
编辑

用户需要 sysadmin 服务器角色。请注意,需要 SQL Server 身份验证。不支持 Windows 身份验证。

要将此连接器用作 自管理连接器,请参阅 自管理连接器。有关其他用法操作,请参阅 Kibana 中的连接器 UI

兼容性
编辑

以下与 Elastic 连接器框架兼容

  • Microsoft SQL Server 版本 2017、2019
  • Azure SQL
  • 适用于 SQL Server 的 Amazon RDS
配置
编辑

当使用 自管理连接器 工作流程时,这些字段最初将使用 连接器源代码 中设置的默认配置。请注意,此数据源使用 generic_database.py 连接器源代码。

有关特定于此数据源的其他代码,请参阅 mssql.py。这些可配置字段将在 Kibana UI 中使用它们各自的 标签 进行渲染。连接后,用户将能够在 Kibana 中更新这些值。

设置连接器需要以下配置字段

host

托管 Microsoft SQL Server 的服务器主机地址。默认值为 127.0.0.1。示例

  • 192.158.1.38
  • demo.instance.demo-region.demo.service.com
port
Microsoft SQL Server 托管的端口。默认值为 9090
username
Microsoft SQL Server 帐户的用户名。(仅限 SQL Server 身份验证)
password
用于 Microsoft SQL Server 的帐户密码。(仅限 SQL Server 身份验证)
database

Microsoft SQL Server 数据库的名称。示例

  • employee_database
  • customer_database
tables

以逗号分隔的表列表。如果值为 *,则 Microsoft SQL 连接器将从配置数据库中存在的所有表中获取数据。默认值为 *。示例

  • table_1, table_2
  • *

    此字段可以通过高级同步规则绕过。

fetch_size
每个请求提取的行数。
retry_count
每次失败请求的重试次数。
schema

Microsoft SQL Server 架构的名称。默认值为 dbo

示例

  • dbo
  • custom_schema
ssl_enabled
启用 SSL 验证。默认值为 False
ssl_ca

SSL 证书的内容。如果禁用 SSL,将忽略 ssl_ca 值。

展开以查看证书示例
-----BEGIN CERTIFICATE-----
MIID+jCCAuKgAwIBAgIGAJJMzlxLMA0GCSqGSIb3DQEBCwUAMHoxCzAJBgNVBAYT
...
7RhLQyWn2u00L7/9Omw=
-----END CERTIFICATE-----
validate_host
启用主机验证。默认值为 False
使用 Docker 部署
编辑

您可以使用 Docker 将 Microsoft SQL 连接器部署为自管理连接器。请按照以下说明操作。

步骤 1:下载示例配置文件

下载示例配置文件。您可以手动下载它,也可以运行以下命令

curl https://raw.githubusercontent.com/elastic/connectors/main/config.yml.example --output ~/connectors-config/config.yml

如果您的目录名称不同,或者您想使用其他配置文件名,请记住更新 --output 参数值。

步骤 2:更新自管理连接器的配置文件

使用以下设置更新配置文件以匹配您的环境

  • elasticsearch.host
  • elasticsearch.api_key
  • connectors

如果您针对 Dockerized 版本的 Elasticsearch 和 Kibana 运行连接器服务,则您的配置文件将如下所示

# When connecting to your cloud deployment you should edit the host value
elasticsearch.host: http://host.docker.internal:9200
elasticsearch.api_key: <ELASTICSEARCH_API_KEY>

connectors:
  -
    connector_id: <CONNECTOR_ID_FROM_KIBANA>
    service_type: mssql
    api_key: <CONNECTOR_API_KEY_FROM_KIBANA> # Optional. If not provided, the connector will use the elasticsearch.api_key instead

建议使用 elasticsearch.api_key 作为身份验证方法。但是,您也可以使用 elasticsearch.usernameelasticsearch.password 来验证您的 Elasticsearch 实例。

注意:您可以通过简单地取消注释配置文件中的特定设置并修改其值来更改其他默认配置。

步骤 3:运行 Docker 镜像

使用以下命令使用连接器服务运行 Docker 镜像

docker run \
-v ~/connectors-config:/config \
--network "elastic" \
--tty \
--rm \
docker.elastic.co/enterprise-search/elastic-connectors:8.17.0.0 \
/app/bin/elastic-ingest \
-c /config/config.yml

有关更多详细信息,请参阅 elastic/connectors 存储库中的 DOCKER.md

官方注册表中查找所有可用的 Docker 镜像。

我们还有一个使用 Docker Compose 的快速启动自管理选项,因此您可以一次启动所有必需的服务:Elasticsearch、Kibana 和连接器服务。有关更多信息,请参阅 elastic/connectors 存储库中的此README

文档和同步
编辑
  • 将跳过未定义主键的表。
  • 如果特定表和数据库的 sys.dm_db_index_usage_stats 表的 last_user_update 不可用,则将同步该表中的所有数据。
  • 不会提取大于 10 MB 的文件。
  • 权限不会同步。索引到 Elastic 部署的所有文档将对所有具有访问权限的用户可见。
同步规则
编辑

基本同步规则 对于所有连接器都是相同的,并且默认可用。有关更多信息,请阅读同步规则

高级同步规则
编辑

此连接器支持用于远程过滤的高级同步规则。这些规则涵盖无法用基本同步规则表达的复杂查询和筛选场景。高级同步规则通过特定于源的 DSL JSON 代码片段定义。

需要完全同步,高级同步规则才能生效。

以下是此连接器的一些高级同步规则示例。

展开以查看示例数据

employee

emp_id 姓名 年龄

3

John

28

10

Jane

35

14

Alex

22

* customer

c_id 姓名 年龄

2

Elm

24

6

Pine

30

9

Oak

34

示例:两个查询

这些规则从 employeecustomer 表中获取所有记录。这些表中的数据将分别同步到 Elasticsearch。

[
  {
    "tables": [
      "employee"
    ],
    "query": "SELECT * FROM employee"
  },
  {
    "tables": [
      "customer"
    ],
    "query": "SELECT * FROM customer"
  }
]

示例:一个 WHERE 查询

此规则仅从 emp_id 大于 5 的 employee 表中获取记录。只有这些经过筛选的记录才会同步到 Elasticsearch。

[
  {
    "tables": ["employee"],
    "query": "SELECT * FROM employee WHERE emp_id > 5"
  }
]

示例:一个 JOIN 查询

此规则通过在 employee 中的 emp_idcustomer 中的 c_id 匹配的条件下,在 employeecustomer 表之间执行 INNER JOIN 来获取记录。此组合数据的结果将同步到 Elasticsearch。

[
  {
    "tables": ["employee", "customer"],
    "query": "SELECT * FROM employee INNER JOIN customer ON employee.emp_id = customer.c_id"
  }
]

使用高级规则时,查询可以绕过配置字段 tables。如果查询指定了未出现在配置中的表,则会发生这种情况。如果配置指定 * 以获取所有表,而高级同步规则仅请求部分表,也可能发生这种情况。

端到端测试
编辑

连接器框架使操作员能够针对真实数据源运行功能测试。有关更多详细信息,请参阅 连接器测试

要执行 Microsoft SQL 连接器的 E2E 测试,请运行以下命令

make ftest NAME=mssql

为了加快测试速度,请添加 DATA_SIZE=small 标志

make ftest NAME=mssql DATA_SIZE=small
已知问题
编辑

此连接器没有已知问题。有关影响所有连接器的任何问题,请参阅已知问题

故障排除
编辑

请参阅故障排除

安全性
编辑

请参阅安全性

此连接器使用 通用数据库连接器源代码(分支 8.17,与 Elastic 8.17 兼容)。

查看 特定于此数据源的其他代码(分支 8.17,与 Elastic 8.17 兼容)。