使用 SQL 命令安装和配置连接器

Snowflake Connector for ServiceNow® 受 Snowflake Connector 条款 的约束。

本主题介绍如何使用 SQL 命令安装和配置连接器。它假定您已经执行了 准备 ServiceNow® 实例 中概述的过程。

本主题内容:

安装 Snowflake Connector for ServiceNow®

以下过程描述了如何安装连接器:

  1. 以具有 ACCOUNTADMIN 角色的用户身份登录 Snowsight。

  2. 在导航菜单中,选择 Data Products » Marketplace

  3. 搜索 Snowflake Connector for ServiceNow®,然后选择连接器的磁贴。

  4. 在 Snowflake Connector for ServiceNow® 页面中,选择 Get

    这将显示一个对话框,您可以使用该对话框开始安装过程的初始部分。

    在对话框中配置以下内容:

    1. Application name 字段中,输入要用作连接器实例的数据库的数据库名称。该数据库是自动为您创建的。

    2. Warehouse used for installation 字段中,选择要用于安装连接器的仓库。

      备注

      这与连接器用于同步来自 ServiceNow® 的数据的仓库不同。在后续步骤中,您将为此目的创建一个单独的仓库。

    3. 选择 Get

  5. 此时将显示一个通知对话框:Installing App After installation, an email will be sent to <user_email>。您现在可以关闭该对话框。要使用 SQL 继续配置,请等到您收到一封电子邮件,说明该 “ServiceNow Snowflake 连接器”已安装并可以使用,然后转到 Worksheets

设置 OAuth

备注

如果您计划使用基本身份验证而不是 OAuth,则可以跳过此部分并继续 创建密钥对象

您可以配置 Snowflake Connector for ServiceNow® 以使用 OAuth 来对 ServiceNow® 实例进行身份验证。支持的 OAuth 流有两种:

  • 客户端凭据授权(推荐):自 Washington DC 发布 (https://www.servicenow.com/docs/bundle/washingtondc-release-notes/page/release-notes/family-release-notes.html) 以来可用。客户端凭据是机器到机器集成的一种广泛认可的授权标准,不需要手动刷新令牌维护。

  • 授权代码授权流:此身份验证方法在所有支持的 ServiceNow® 版本上都可用,但使用此方法时,OAuth 令牌必须在到期日之前手动刷新,通常每 3 个月刷新一次。

设置具有客户端凭据授权流的 OAuth

要将 Snowflake Connector for ServiceNow® 配置为使用具有客户端凭据授权流的 OAuth 对 ServiceNow® 实例进行身份验证,请执行以下操作:

  • 在 ServiceNow® 中,您必须将实例设置为支持使用具有 客户端凭据授权流 (https://www.servicenow.com/docs/bundle/washingtondc-platform-security/page/integrate/authentication/concept/client-credentials.html) 的 OAuth。

  • 在 Snowflake Connector for ServiceNow® 中:

    • 该连接器使用 TYPE = API_AUTHENTICATION 安全集成将 Snowflake 连接到 ServiceNow® 实例。

      安全集成会指定 ServiceNow® OAuth 客户端 ID、客户端密钥以及端点 URL,以用于对 ServiceNow® 实例进行身份验证。

    • 该连接器使用 Snowflake 密钥对象来管理敏感信息,包括身份验证凭据。

      在使用 OAuth 进行身份验证的情况下,该连接器会将 ServiceNow® OAuth 范围以及安全集成的名称存储在 Snowflake 密钥对象中。

如果 ServiceNow® 实例已使用 OAuth 客户端凭据授权流,并且您希望将该实例与 Snowflake Connector for ServiceNow® 一起使用,请记下与 OAuth 令牌对应的客户端 ID、客户端密钥和端点 URL。有关更多信息,请参阅 管理 OAuth 令牌 (https://docs.servicenow.com/bundle/washingtondc-platform-security/page/administer/security/task/t_ManageTokens.html)。记下此信息后,请继续 创建基本对象

配置 ServiceNow® 实例以使用具有客户端凭据授权流的 OAuth

  1. 配置您的实例以通过授权代码授予流程使用 OAuth,如 建立 OAuth (https://docs.servicenow.com/bundle/washingtondc-platform-security/page/administer/security/task/t_SettingUpOAuth.html) 中所示。

  2. 为客户端创建端点以访问实例 (https://docs.servicenow.com/bundle/washingtondc-platform-security/page/administer/security/task/t_CreateEndpointforExternalClients.html),并使用它来配置连接器:

    1. 登录到 ServiceNow® 实例,然后选择 Homepage

    2. 搜索 sys_properties.list

    3. 在表中搜索具有 glide.oauth.inbound.client.credential.grant_type.enabled 名称的属性,并确保其设置为 true

      备注

      如果属性不存在,则创建。点击 New 按钮,并填写新属性的以下字段:

      • Name 设置为 glide.oauth.inbound.client.credential.grant_type.enabled

      • Type 设置为 true | false

      • Value 设置为 true

    4. 搜索 System OAuth,然后选择 Application Registry

    5. 依次选择 NewCreate an OAuth API endpoint for external clients

    6. 在 ServiceNow® 中的 Name 字段中,输入 OAuth 应用程序注册表的名称。

    7. 在 ServiceNow® 中的 OAuth Application User 字段中,选择希望连接器向其进行身份验证的用户。用户需要具有 准备 ServiceNow® 实例 中列出的权限。

      备注

      如果 OAuth Application User 字段在表单中不可用,请打开屏幕左上角的 Additional actions 菜单。从菜单 Configure > Form builder 中选择。然后将缺少的 OAuth Application User 字段添加到表单的 Default 视图中。Save 表单并刷新页面以继续。

    8. 在 ServiceNow® 中,选择 Submit

      OAuth 应用程序注册表显示在应用程序注册表列表中。

    9. 在 ServiceNow® 中,选择您刚刚创建的应用程序注册表。

      请注意,ServiceNow® 已为 Client IDClient Secret 字段生成值。您可以在 创建安全集成 时使用这些值。

设置具有授权代码授权流的 OAuth

要将 Snowflake Connector for ServiceNow® 配置为使用具有授权代码授权流的 OAuth 对 ServiceNow® 实例进行身份验证,请执行以下操作:

  • 在 ServiceNow 中,您必须将实例设置为支持与 授权代码许可流程 (https://docs.servicenow.com/bundle/washingtondc-platform-security/page/administer/security/concept/c_OAuthAuthorizationCodeFlow.html) 搭配使用 OAuth。

  • 在 Snowflake Connector for ServiceNow® 中:

    • 该连接器使用 TYPE = API_AUTHENTICATION 安全集成将 Snowflake 连接到 ServiceNow® 实例。

      安全集成会指定 ServiceNow® OAuth 客户端 ID、客户端密钥以及端点 URL,以用于对 ServiceNow® 实例进行身份验证。

    • 该连接器使用 Snowflake 密钥对象来管理敏感信息,包括身份验证凭据。

      在使用 OAuth 进行身份验证的情况下,该连接器会将 ServiceNow® OAuth 刷新令牌、刷新令牌过期时间以及安全集成的名称存储在 Snowflake 密钥对象中。

如果您的 ServiceNow® 实例已经使用了 OAuth 授权代码授予流,并且您希望将该实例与 Snowflake Connector for ServiceNow® 一起使用,请记下与 OAuth 令牌对应的客户端 ID、客户端密钥和端点 URL。有关更多信息,请参阅 管理 OAuth 令牌 (https://docs.servicenow.com/bundle/washingtondc-platform-security/page/administer/security/task/t_ManageTokens.html)。记下此信息后,请继续 生成OAuth 刷新令牌

配置 ServiceNow® 实例以通过授权代码授予流程使用 OAuth

  1. 配置您的实例以通过授权代码授予流程使用 OAuth,如 建立 OAuth (https://docs.servicenow.com/bundle/washingtondc-platform-security/page/administer/security/task/t_SettingUpOAuth.html) 中所示。

  2. 为客户端创建端点以访问实例 (https://docs.servicenow.com/bundle/washingtondc-platform-security/page/administer/security/task/t_CreateEndpointforExternalClients.html),并使用它来配置连接器:

    1. 登录到 ServiceNow® 实例,然后选择 Homepage

    2. 搜索 OAuth,然后选择 Application Registry

    3. 依次选择 NewCreate an OAuth API endpoint for external clients

      系统会显示应用程序注册表的配置页,如下图所示:

      在 ServiceNow® 中显示应用程序注册表页。
    4. 在 ServiceNow 中的字段 Name 中,输入 OAuth 应用程序注册表的名称。

    5. 如果需要,请在 ServiceNow 中更新字段 Refresh Token LifespanAccess Token Lifespan 的值。

      • Snowflake 建议将访问令牌的有效期设置为至少 600 秒。

      • 对于刷新令牌的有效期,请指定值为 7776000(90 天)。

    6. 在 ServiceNow 中,选择 Submit

      OAuth 应用程序注册表显示在应用程序注册表列表中。

    7. 在 ServiceNow 中,选择您刚刚创建的应用程序注册表。

      请注意,ServiceNow® 已为 Client IDClient Secret 字段生成值。您可以在 创建安全集成 时使用这些值。

生成 OAuth 刷新令牌

要生成 OAuth 刷新令牌,请执行以下步骤:

  1. 向 ServiceNow® 实例的 /oauth_token.do 端点发送 HTTP 请求,如 ServiceNow® 文档中的 REST OAuth 示例 (https://docs.servicenow.com/bundle/washingtondc-api-reference/page/integrate/inbound-rest/reference/r_RESTOAuthExample.html) 所述。

    例如,如果您使用 curl 发送 HTTP 请求:

    curl -d "grant_type=password" --data-urlencode "client_id=<client_id>" --data-urlencode "client_secret=<client_secret>" --data-urlencode "username=<username>" --data-urlencode "password=<password>" -X POST https://<servicenow_instance>.service-now.com/oauth_token.do
    
    Copy

    其中

    <servicenow_instance>

    指定 ServiceNow® 实例的名称。

    client_idclient_secret

    指定设置 ServiceNow® 端点时获取的值。

    usernamepassword

    为 ServiceNow® 实例指定凭据。

    备注

    上面的示例使用 curl 中的 data-urlencode 命令行标志,对发送到 ServiceNow® 的 HTTP 请求中的客户端密钥、用户名和密码进行 URL 编码 (link removed)。

    如果使用其他工具发送 HTTP 请求,请确保对请求中的这些值进行 URL 编码。

    HTTP 响应的正文包含一个 JSON 对象。从以下对象的 refresh_token 字段获取刷新令牌:

    {"access_token":"abcd1234","refresh_token":"cdef567","scope":"useraccount","token_type":"Bearer","expires_in":1799}
    
    Copy

创建基本对象

创建安全集成(可选)

备注

如果您计划使用基本身份验证而不是 OAuth,则可以跳过此部分并继续 创建密钥对象

安全集成是一个 Snowflake 对象,它在 Snowflake 和第三方 OAuth 2.0 服务之间提供一个接口。

为具有客户端凭据授权流的 OAuth 创建安全集成

使用命令 CREATE SECURITY INTEGRATION 创建安全集成,如以下示例所示:

CREATE SECURITY INTEGRATION <name>
 TYPE = API_AUTHENTICATION
 AUTH_TYPE = OAUTH2
 OAUTH_CLIENT_AUTH_METHOD = CLIENT_SECRET_POST
 OAUTH_CLIENT_ID = '<client_id>'
 OAUTH_CLIENT_SECRET = '<client_secret>'
 OAUTH_TOKEN_ENDPOINT = 'https://<servicenow_instance>.service-now.com/oauth_token.do'
 OAUTH_GRANT = 'CLIENT_CREDENTIALS'
 OAUTH_ALLOWED_SCOPES = ('useraccount')
 ENABLED = TRUE;
Copy

其中:

name

指定安全集成的名称。该名称在您账户中的集成中必须是唯一的。

client_id

指定设置 ServiceNow® 端点时获取的 Client ID 字段值。

client_secret

指定设置 ServiceNow® 端点时获取的 Client Secret 字段值。

servicenow_instance_name

指定 ServiceNow® 实例的名称。这是 ServiceNow® 实例主机名的第一部分。例如,如果指向 ServiceNow® 实例的 URL 为:

https://myinstance.service-now.com
Copy

实例的名称将是 myinstance

为具有授权代码授权流的 OAuth 创建安全集成

使用命令 CREATE SECURITY INTEGRATION 创建安全集成,如以下示例所示:

CREATE SECURITY INTEGRATION <name>
 TYPE = API_AUTHENTICATION
 AUTH_TYPE = OAUTH2
 OAUTH_CLIENT_AUTH_METHOD = CLIENT_SECRET_POST
 OAUTH_CLIENT_ID = '<client_id>'
 OAUTH_CLIENT_SECRET = '<client_secret>'
 OAUTH_TOKEN_ENDPOINT = 'https://<servicenow_instance>.service-now.com/oauth_token.do'
 ENABLED = TRUE;
Copy

其中:

name

指定安全集成的名称。该名称在您账户中的集成中必须是唯一的。

client_id

指定设置 ServiceNow® 端点时获取的 Client ID 字段值。

client_secret

指定设置 ServiceNow® 端点时获取的 Client Secret 字段值。

servicenow_instance_name

指定 ServiceNow® 实例的名称。这是 ServiceNow® 实例主机名的第一部分。例如,如果指向 ServiceNow® 实例的 URL 为:

https://myinstance.service-now.com
Copy

实例的名称将是 myinstance

创建密钥对象

创建 Snowflake Connector for ServiceNow® 用于身份验证的 Snowflake 密钥对象。

Snowflake 建议将密钥对象存储在专用数据库和架构中。请注意,您可以选择任意角色来管理密钥,也可以选择任意数据库和架构来存储密钥。

若要创建自定义角色来管理密钥,请使用以下 CREATE ROLE 命令。有关可以授予角色的权限的信息,请参阅 访问控制权限

下一节介绍如何创建存储在单独的数据库和架构中并由自定义角色管理的密钥对象。

为密钥对象创建架构

首先,通过运行 CREATE DATABASECREATE SCHEMA 命令创建数据库和架构来存储密钥对象。架构和数据库的名称必须是有效的 对象标识符

例如,若要为密钥对象创建数据库 secretsdb 和架构 apiauth,请运行以下命令:

USE ROLE accountadmin;
CREATE DATABASE secretsdb;
CREATE SCHEMA apiauth;
Copy

创建自定义角色以管理密钥(可选)

接下来,创建一个自定义角色来管理密钥(假设您不想使用现有角色),并向该角色授予创建密钥所需的权限。

  1. 使用 USERADMIN 系统角色,运行命令 CREATE ROLE 创建自定义角色来管理密钥。例如,若要创建用于管理密钥的自定义角色 secretadmin,请运行以下命令:

    USE ROLE useradmin;
    CREATE ROLE secretadmin;
    
    Copy
  2. 使用 SECURITYADMIN 系统角色,运行命令 GRANT <privileges> TO ROLE 向自定义角色授予以下权限:

    例如:

    USE ROLE securityadmin;
    GRANT USAGE ON DATABASE secretsdb TO ROLE secretadmin;
    GRANT USAGE ON SCHEMA secretsdb.apiauth TO role secretadmin;
    GRANT CREATE SECRET ON SCHEMA secretsdb.apiauth TO role secretadmin;
    
    Copy
  3. (可选)如果要使用 OAuth 身份验证设置连接器,那么还需要将 您之前创建的安全集成 的 USAGE 权限授予自定义角色。

    例如:

    USE ROLE securityadmin;
    GRANT USAGE ON INTEGRATION servicenow_oauth TO role secretadmin;
    
    Copy
  4. 使用 USERADMIN 系统角色,运行 GRANT <privileges> TO ROLE 命令,将自定义角色授予创建密钥的用户。例如,要向用户 servicenow_secret_owner 授予角色,请运行以下命令:

    USE ROLE useradmin;
    GRANT ROLE secretadmin TO user servicenow_secret_owner;
    
    Copy

创建密钥

接下来,创建一个密钥,使 Snowflake 能够使用 OAuth 和身份验证代码授权流程对 ServiceNow® 实例进行身份验证。

备注

如果您打算使用基本身份验证而不是 OAuth,请参阅 下面的“注意”事项

要为具有客户端凭据授权流的 OAuth 创建密钥对象,请使用以下参数运行 CREATE SECRET 命令:

  • TYPE 设置为 OAUTH2

  • API_AUTHENTICATION 设置为您在 创建基本对象 中创建的安全集成的名称:

  • OAUTH_SCOPES 设置为 useraccount

例如,要创建名为 service_now_creds_oauth_code 的密钥,并让它使用名为 servicenow_oauth 的安全集成,请运行以下命令:

USE ROLE secretadmin;
USE SCHEMA secretsdb.apiauth;
CREATE SECRET servicenow_creds_oauth_code
  TYPE = OAUTH2
  API_AUTHENTICATION = servicenow_oauth
  OAUTH_SCOPES=('useraccount');
Copy

要为具有授权代码授权流的 OAuth 创建密钥对象,请使用以下参数运行 CREATE SECRET 命令:

  • TYPE 设置为 OAUTH2

  • OAUTH_REFRESH_TOKEN 设置为您在 生成 OAuth 刷新令牌 中检索到的 OAuth 刷新令牌。

  • OAUTH_REFRESH_TOKEN_EXPIRY_TIME 设置为 UTC 时区的刷新令牌过期时间戳。您可以通过将来自 ServiceNow® 的令牌有效期与令牌发布日期相加,计算出该时间戳。默认情况下,令牌有效期为 100 天。

  • API_AUTHENTICATION 设置为您在 创建基本对象 中创建的安全集成的名称:

例如,要创建名为 service_now_creds_oauth_code 的密钥,并让它使用名为 servicenow_oauth 的安全集成,请运行以下命令:

USE ROLE secretadmin;
USE SCHEMA secretsdb.apiauth;
CREATE SECRET servicenow_creds_oauth_code
  TYPE = OAUTH2
  OAUTH_REFRESH_TOKEN = 'cdef567'
  OAUTH_REFRESH_TOKEN_EXPIRY_TIME = '2022-01-06 20:00:00'
  API_AUTHENTICATION = servicenow_oauth;
Copy

若要修改现有密钥的属性(例如更新 OAuth 刷新令牌),请使用 ALTER SECRET 命令。

备注

如果您打算使用基本身份验证(而不是 OAuth),请运行命令 CREATE SECRET 创建密钥,并将 TYPE 设置为 PASSWORD。将 USERNAMEPASSWORD 设置为您打算用于对 ServiceNow® 实例进行身份验证的 ServiceNow 用户的用户名和密码。例如:

USE ROLE secretadmin;
USE SCHEMA secretsdb.apiauth;
CREATE SECRET servicenow_creds_pw
  TYPE = PASSWORD
  USERNAME = 'jsmith1'
  PASSWORD = 'W3dr@fg*7B1c4j';
Copy

如果为此用户启用了多重身份验证,则必须提供 MFA 令牌和密码,如 ServiceNow® 文档的 REST API (https://docs.servicenow.com/bundle/washingtondc-api-reference/page/integrate/inbound-rest/concept/c_RESTAPI.html) 中所述。

创建仓库

Snowflake 建议 创建一个连接器专用仓库。专用仓库可以更好地进行成本管理和资源跟踪。为了便于资源跟踪,您可以选择为专用仓库 添加一个或多个标签

对于连接器仓库,Snowflake 建议使用大型仓库。

若要创建名为 servicenow_conn_warehouse 的大型仓库,请运行以下命令:

USE ROLE accountadmin;
CREATE WAREHOUSE servicenow_conn_warehouse WAREHOUSE_SIZE = LARGE;
Copy

注意

确保仓库能够执行查询至少 8 小时。它受参数值的影响,该参数值既可以在连接器使用的仓库上设置,也可以在账户上设置(账户的值优先)。要检查当前值,请运行:

SHOW PARAMETERS LIKE 'STATEMENT_TIMEOUT_IN_SECONDS' FOR ACCOUNT;
SHOW PARAMETERS LIKE 'STATEMENT_TIMEOUT_IN_SECONDS' FOR WAREHOUSE <connector_warehouse>;
Copy

如果两个值都至少为 :code:`28800`(即 8 小时),则无需更改。否则,请根据需要运行以下命令之一:

ALTER ACCOUNT SET STATEMENT_TIMEOUT_IN_SECONDS = 28800;
ALTER WAREHOUSE <connector_warehouse> SET STATEMENT_TIMEOUT_IN_SECONDS = 28800;
Copy

如未提供适当的超时,则会发生数据引入失败的情况。

为 ServiceNow® 数据创建数据库和架构

接下来,创建用于 ServiceNow® 数据的数据库和架构。Snowflake Connector for ServiceNow® 会将 ServiceNow® 数据引入到此数据库和架构。

创建数据库和架构时,请注意以下事项:

若要创建数据库和架构,请运行 CREATE DATABASECREATE SCHEMA 命令。

例如,若要为 ServiceNow® 数据创建数据库 dest_db 和架构 dest_schema,请运行以下命令:

USE ROLE accountadmin;
CREATE DATABASE dest_db;
CREATE SCHEMA dest_schema;
Copy

备注

如果要重新安装连接器,则可以重复使用为以前安装的连接器创建的架构。如果连接器在之前的安装过程中已加载数据,并且您希望继续将数据加载到相同的表中,则可以执行此操作。

要继续加载数据,请勿在 重新安装连接器 前修改架构。不要更改之前安装连接器时创建的表的定义。

连接器会定期将连接器配置和状态导出到架构中的 __CONNECTOR_STATE_EXPORT 表,该表稍后可用于在重新安装期间恢复连接器配置。或者,如果导出表不存在或已手动删除,您仍可以于稍后调用 ENABLE_TABLES 存储过程 来重新启用之前引入的表。存储过程会验证所有必需的对象是否已存在,并且不会尝试重新创建它们,因此不会有丢失已引入数据的风险。

创建用于与 ServiceNow® 实例通信的网络规则

接下来,要允许从您的账户到 ServiceNow® 实例的出站流量,请创建一个网络规则。以 accountadmin 身份,运行以下语法的 CREATE NETWORK RULE 命令:

CREATE NETWORK RULE <name>
  MODE = 'EGRESS'
  TYPE = 'HOST_PORT'
  VALUE_LIST = ('<servicenow_instance>.service-now.com');
Copy

其中:

name

指定网络规则的名称。名称必须是有效的 对象标识符

VALUE_LIST = ('servicenow_instance_name.service-now.com')

指定可以向其发送请求的允许的 ServiceNow® 实例列表。

例如,要在数据库 secretsdb``的 ``apiauth 架构中创建名为 servicenow_network_rule 的网络规则,请运行以下命令:

USE ROLE accountadmin;
CREATE NETWORK RULE secretsdb.apiauth.servicenow_network_rule
  MODE = 'EGRESS'
  TYPE = 'HOST_PORT'
  VALUE_LIST = ('myinstance.service-now.com');
Copy

备注

如果您使用自定义角色创建了密钥,则需在创建网络规则之前额外向 ACCOUNTADMIN 授予对此密钥的 USAGE 权限:

USE ROLE secretadmin;
GRANT USAGE ON SECRET secretsdb.apiauth.<secret_name> TO ROLE ACCOUNTADMIN;
Copy

创建用于与 ServiceNow® 实例通信的外部访问集成

接下来,创建一个外部访问集成,用于与 ServiceNow® 实例通信。使用以下语法运行 CREATE EXTERNAL ACCESS INTEGRATION 命令:

CREATE EXTERNAL ACCESS INTEGRATION <integration_name>
  ALLOWED_NETWORK_RULES = (<network_rule_name>)
  ALLOWED_AUTHENTICATION_SECRETS = (<secret_name>)
  ENABLED = TRUE;
Copy

其中:

integration_name

指定该外部访问集成的名称。名称必须是有效的 对象标识符。该名称在您账户中的集成中必须是唯一的。

ALLOWED_NETWORK_RULES = (network_rule_name)

指定允许访问您的 ServiceNow® 实例的网络规则。这会将此集成的使用限定到具有网络规则中指定的 URLs 的实例。

将此值设置为您在 创建用于与 ServiceNow® 实例通信的网络规则 中创建的网络规则的名称。

ALLOWED_AUTHENTICATION_SECRETS = (secret_name)

指定允许在 API 集成范围内使用的密钥名称的列表。

将此值设置为您在 创建密钥对象 中创建的密钥对象的名称。

ENABLED = TRUE

指定是启用还是禁用此 API 集成。如果禁用 API 集成,则依赖它的任何外部功能都无法正常工作。

TRUE

允许集成基于集成定义中指定的参数运行。

FALSE

暂停集成以进行维护。Snowflake 与第三方服务之间的任何集成都无法正常工作。

例如,要创建名为 servicenow_external_access_integration 的外部访问集成,请运行以下命令:

USE ROLE accountadmin;
CREATE EXTERNAL ACCESS INTEGRATION servicenow_external_access_integration
  ALLOWED_NETWORK_RULES = (secretsdb.apiauth.servicenow_network_rule)
  ALLOWED_AUTHENTICATION_SECRETS = (secretsdb.apiauth.servicenow_creds_pw)
  ENABLED = TRUE
Copy

为连接器配置日志记录

Snowflake Connector for ServiceNow® 使用事件表来存储连接器的错误日志。要设置事件表,请遵循 设置事件表 指南。

重要

强烈建议启用 日志共享。在排查任何不明显的问题时,这将是非常有用的帮助。

设置已安装的连接器

要设置连接器,请执行以下操作:

  1. 使用 Snowsight 为连接器实例创建数据库。有关如何创建数据库的详细信息,请参阅 使用 Snowsight 安装和配置连接器

  2. 导航到 SQL 工作表。

  3. 以具有 ACCOUNTADMIN 角色的用户身份登录。例如:

    USE ROLE ACCOUNTADMIN;
    
    Copy
  4. 用作连接器实例的数据库 授予连接器所需的全部权限。

    例如,向名为 my_connector_servicenow 的连接器授予以下权限:

    • 账户的 EXECUTE TASK 权限

    • 账户的 EXECUTE MANAGED TASK 权限

    • 对仓库 servicenow_conn_warehouse 的 USAGE 权限

    • dest_db 数据库的 USAGE 权限

    • 对架构 dest_db.dest_schema 的 USAGE、CREATE TABLE 和 CREATE VIEW 权限

    • 对集成 servicenow_external_access_integration 的 USAGE 权限

    • secretsdb 数据库的 USAGE 权限

    • 对架构 secretsdb.apiauth 的 USAGE 权限

    • 对密钥 secretsdb.apiauth.servicenow_creds_oauth_code secret 的 READ 权限

    请运行以下命令:

    USE ROLE accountadmin;
    
    GRANT EXECUTE TASK ON ACCOUNT TO APPLICATION my_connector_servicenow;
    GRANT EXECUTE MANAGED TASK ON ACCOUNT TO APPLICATION my_connector_servicenow;
    
    GRANT USAGE ON WAREHOUSE servicenow_conn_warehouse TO APPLICATION my_connector_servicenow;
    
    GRANT USAGE ON DATABASE dest_db TO APPLICATION my_connector_servicenow;
    GRANT USAGE ON SCHEMA dest_db.dest_schema TO APPLICATION my_connector_servicenow;
    GRANT CREATE TABLE ON SCHEMA dest_db.dest_schema TO APPLICATION my_connector_servicenow;
    GRANT CREATE VIEW ON SCHEMA dest_db.dest_schema TO APPLICATION my_connector_servicenow;
    
    GRANT USAGE ON INTEGRATION servicenow_external_access_integration TO APPLICATION my_connector_servicenow;
    
    GRANT USAGE ON DATABASE secretsdb TO APPLICATION my_connector_servicenow;
    GRANT USAGE ON SCHEMA secretsdb.apiauth TO APPLICATION my_connector_servicenow;
    GRANT READ ON SECRET secretsdb.apiauth.servicenow_creds_oauth_code TO APPLICATION my_connector_servicenow;
    
    Copy
  5. 在目标架构中转移表和视图的所有权(可选)

    如果重新安装了连接器,并且重复使用了以前的目标架构,则必须将目标架构中所有表和视图的所有权转移到连接器。连接器需要所有权权限才能管理对架构中对象的授权,并在引入表的架构发生更改时重新创建扁平化视图。

    要转让所有权,请调用 SYSTEM$GRANT_OWNERSHIP_TO_APPLICATION 函数。

    USE ROLE accountadmin;
    CALL SYSTEM$GRANT_OWNERSHIP_TO_APPLICATION(<connector_app>, true, <destination_database>, <destination_schema>);
    
    Copy

    SYSTEM$GRANT_OWNERSHIP_TO_APPLICATION 是 Snowflake 提供的一种系统函数,它允许将指定数据库或架构中的表和视图的所有权转移给应用程序。只会转移常规表和常规视图的所有权,例如不会转移动态表、外部表、物化视图等的所有权。

    该函数具有以下签名:

    SYSTEM$GRANT_OWNERSHIP_TO_APPLICATION(<to_app>, <should_copy_grants>, <from_database>, <from_schema>)
    
    Copy

    其中:

    to_app

    指定应向其转移对象所有权的应用程序的名称。

    should_copy_grants

    如果为 TRUE,则复制现有授权,否则撤销。复制授权要求调用方具有 MANAGE GRANTS 权限。

    from_database

    包含应更改其所有权的对象的数据库的名称。

    from_schema

    (可选)包含应更改其所有权的对象的架构的名称。如未指定架构,则在所提供的数据库中的所有架构中的表和视图上转移所有权。托管架构中的对象在所有权转移期间会被省略。

    要执行该函数,调用方须满足以下条件之一:

    • 它具有 MANAGE GRANTS 权限(例如 ACCOUNTADMIN 或 SECURITYADMIN 角色),或者

    • 它包含拥有应用程序实例的角色和拥有所有对象的角色,以便转移所有权。缺少所有权的对象将被函数省略。

    例如,转移以下连接器的所有权时:

    • 作为名为 my_connector_servicenow 的应用程序安装

    • 对 Snowflake 中的 ServiceNow 数据使用名为 dest_db.dest_schema 的架构

    运行以下命令:

    USE ROLE accountadmin;
    CALL SYSTEM$GRANT_OWNERSHIP_TO_APPLICATION('my_connector_servicenow', true, 'dest_db', 'dest_schema');
    
    Copy

    如果需要,请将 DATA_READER 应用程序角色授予先前拥有数据的角色,以使用数据防止现有管道中断:

    GRANT APPLICATION ROLE <connector_app>.DATA_READER TO ROLE <previous_data_owner_role>;
    
    Copy

    请注意,在 CONFIGURE_CONNECTOR 过程运行之前,DATA_READER 应用程序角色在目标架构中的表和视图上不会获得任何授权。

  6. 运行命令 USE DATABASE 以将数据库用于连接器。例如:

    USE DATABASE my_connector_servicenow;
    
    Copy
  7. 通过使用 CALL 命令调用名为 CONFIGURE_CONNECTOR 的存储过程来配置连接器:

    CALL CONFIGURE_CONNECTOR({
      'warehouse': '<warehouse_name>',
      'destination_database': '<dest_db>',
      'destination_schema': '<dest_schema>'
    })
    
    Copy

    其中:

    warehouse_name

    指定连接器的仓库名称。

    仓库的名称必须是有效的 对象标识符

    dest_db

    Snowflake 中的 ServiceNow® 数据指定数据库(您之前创建的数据库) 的名称。

    数据库的名称必须是有效的 对象标识符

    dest_schema

    Snowflake 中的 ServiceNow® 数据指定架构(您之前创建的架构) 的名称。

    架构的名称必须是有效的 对象标识符

    例如,要配置连接器,请执行以下步骤:

    • 使用仓库 servicenow_conn_warehouse

    • 对 Snowflake 中的 ServiceNow 数据使用名为 dest_db.dest_schema 的架构

    运行以下命令:

    CALL CONFIGURE_CONNECTOR({
      'warehouse': 'servicenow_conn_warehouse',
      'destination_database': 'dest_db',
      'destination_schema': 'dest_schema'
    });
    
    Copy

    如果连接器已成功启动,则此存储过程会返回以下响应:

    {
      "responseCode": "OK",
      "message": "Connector successfully configured.",
    }
    
    Copy

    备注

    启动连接器后,将无法为连接器重命名已传递的仓库、目标数据库和目标架构。因为连接器通过名称来引用它们。因此,如果尝试删除或修改这些对象的名称,将会导致连接器失效并停止正常工作。

    请使用 UPDATE_WAREHOUSE 存储过程来更改连接器使用的仓库,而不是重命名仓库。

  8. 使用 CALL 命令配置与 ServiceNow® 实例的连接,以调用名为 SET_CONNECTION_CONFIGURATION 的存储过程:

    CALL SET_CONNECTION_CONFIGURATION({
      'service_now_url': '<servicenow_base_url>',
      'secret': '<secret_name>',
      'external_access_integration': '<external_access_integration_name>'
    })
    
    Copy

    其中:

    servicenow_base_url

    指定连接器应使用的 ServiceNow® 实例的 URL。URL 应采用以下格式:

    https://<servicenow_instance>.service-now.com
    
    Copy
    secret_name

    指定包含 ServiceNow® 身份验证凭据的 密钥(您之前创建的密钥)对象 的完全限定名称。

    您必须按以下格式指定密钥对象的完称:

    <database_name>.<schema_name>.<secret_name>
    
    Copy

    数据库、架构和密钥的名称必须是有效的 对象标识符

    external_access_integration_name

    指定 ServiceNow® 的外部访问集成(您之前创建的外部访问集成) 的名称。

    集成的名称必须是有效的 对象标识符

    例如,要配置与 ServiceNow® 实例的连接,请执行以下操作:

    • 包含 URL https://myinstance.service-now.com

    • 使用存储在 secretsdb.apiauth.servicenow_creds_oauth_code 中的密钥。

    • 使用名为 servicenow_external_access_integration 的外部访问集成。

    运行以下命令:

    CALL SET_CONNECTION_CONFIGURATION({
      'service_now_url': 'https://myinstance.service-now.com',
      'secret': 'SECRETSDB.APIAUTH.SERVICENOW_CREDS_OAUTH_CODE',
      'external_access_integration': 'SERVICENOW_API_INTEGRATION'
    });
    
    Copy

    如果连接配置成功,则此存储过程将返回以下响应:

    {
      "responseCode": "OK",
      "message": "Test request to ServiceNow® succeeded.",
    }
    
    Copy

    备注

    配置连接后,将无法更改已传递的密钥和外部访问集成的名称。因为连接器通过名称来引用它们。因此,如果尝试删除或修改这些对象的名称,将会导致连接器失效并停止正常工作。

  9. 使用 CALL 命令完成连接器的配置,以调用名为 FINALIZE_CONNECTOR_CONFIGURATION 的存储过程:

    CALL FINALIZE_CONNECTOR_CONFIGURATION({
      'journal_table': '<name_of_journal_table>',
      'table_name': '<name_of_audited_table>',
      'sys_id': '<sys_id_of_audited_entry>'
    })
    
    Copy

    其中:

    name_of_journal_table

    指定包含有关已删除记录信息的表的名称。有关更多信息,请参阅 准备 ServiceNow® 实例

    请注意,有关已删除记录的信息仅适用于那些设置为传播删除操作的表。

    要阻止传播已删除记录,请为此实参指定 null

    name_of_audited_table

    (可选)指定应存在于日志表中并且连接器应有权访问的已审计表的名称。在对日志表的访问权限进行验证期间,连接器将查找与该表相关的审计条目。在对 ServiceNow® 的查询成功,但未给出任何结果,并导致过程失败时提供此选项。确保连接器的 ServiceNow® 用户有权访问指定表的所有条目。

    此选项不能与 sys_id 参数一起使用。

    sys_id_of_audited_entry

    (可选)指定来自某个已审计表(该表应存在于日志表中,并且连接器应有权访问该表)的条目的 sys_id。在对日志表的访问权限进行验证期间,连接器将查找与此 sys_id 相关的审计条目。在对 ServiceNow® 的查询成功,但未给出任何结果,并导致过程失败时提供此选项。确保连接器的 ServiceNow® 用户有权访问指定的条目。

    此选项不能与 table_name 参数一起使用。

    如果连接器已成功启动,则此存储过程会返回以下响应:

    {
        "responseCode": "OK",
    }
    
    Copy

    在完成连接器配置期间,连接器将尝试检查目标架构中是否存在之前导出的连接器状态。如果 __CONNECTOR_STATE_EXPORT 表存在且可供连接器访问,则该连接器将尝试导入状态。成功完成导入后,导出表将被删除。如果在导入过程中发生错误,则可在修复错误后再次运行 FINALIZE_CONNECTOR_CONFIGURATION 过程。如果不想导入状态或不想修复导入错误,请从连接器转移表的所有权并删除该表。

新创建的数据库是连接器实例,包含以下内容:

连接器应用程序角色

作为原生应用程序,Snowflake Connector for ServiceNow® 会定义 应用程序角色。可在 连接器基于角色的访问控制 中查看它们。

示例安装脚本

以下示例脚本演示如何使用 SQL 工作表配置 Snowflake Connector for ServiceNow®。这可以帮助您在自己的环境中快速设置连接器并开始使用。只需将命令复制并粘贴到工作表中,然后使用您的值填充占位符。

重要

假定应用程序已经安装在 此处 所述的账户中。

在执行命令之前,请查看脚本并根据自己的需要进行调整:

-- Specify values as required by your installation
SET application_name = 'SNOWFLAKE_CONNECTOR_FOR_SERVICENOW'; -- use the same name as provided in the installation
SET connector_warehouse = 'SNOWFLAKE_CONNECTOR_FOR_SERVICENOW_WAREHOUSE';
SET servicenow_instance_domain = '<servicenow_instance>.service-now.com';

SET destination_database = 'SNOWFLAKE_CONNECTOR_FOR_SERVICENOW_DEST_DB';
SET destination_schema = 'SNOWFLAKE_CONNECTOR_FOR_SERVICENOW_DEST_SCHEMA';

SET secret_database = 'CONNECTORS_SECRET';
SET secret_schema = 'SNOWFLAKE_CONNECTOR_FOR_SERVICENOW';
SET secret_database_schema = $secret_database || '.' || $secret_schema;
SET secret_fqn = $secret_database_schema || '.' || 'SECRET';

SET network_rule_fqn = $secret_database_schema || '.' || 'NETWORK_RULE';
SET external_access_integration_name = 'SNOWFLAKE_CONNECTOR_FOR_SERVICENOW_EXTERNAL_ACCESS_INTEGRATION';

SET destination_database_schema = $destination_database || '.' || $destination_schema;
SET servicenow_instance_url = 'https://' || $servicenow_instance_domain || '/';

-- Create essential objects
USE ROLE accountadmin;

CREATE WAREHOUSE IF NOT EXISTS IDENTIFIER($connector_warehouse)
   WAREHOUSE_SIZE = 'MEDIUM'
   AUTO_RESUME = TRUE;
CREATE DATABASE IF NOT EXISTS IDENTIFIER($secret_database);
CREATE SCHEMA IF NOT EXISTS IDENTIFIER($secret_database_schema);
CREATE DATABASE IF NOT EXISTS IDENTIFIER($destination_database);
CREATE SCHEMA IF NOT EXISTS IDENTIFIER($destination_database_schema);

-- Populate with your credentials
CREATE SECRET IDENTIFIER($secret_fqn)
   TYPE = PASSWORD
   USERNAME = '<servicenow_login>'
   PASSWORD = '<servicenow_password>';

-- None of the following commands should require any changes
CREATE NETWORK RULE IDENTIFIER($network_rule_fqn)
   MODE = 'EGRESS'
   TYPE = 'HOST_PORT'
   VALUE_LIST = ($servicenow_instance_domain);

CREATE PROCEDURE execute_immediate_create_ea_integration()
RETURNS VARIANT
EXECUTE AS caller
AS
BEGIN
   EXECUTE IMMEDIATE '
      CREATE EXTERNAL ACCESS INTEGRATION IDENTIFIER($external_access_integration_name)
      ALLOWED_NETWORK_RULES = ($network_rule_fqn)
      ALLOWED_AUTHENTICATION_SECRETS = ('  ||  $secret_fqn  ||  ') ENABLED = TRUE
   ';
END;
CALL execute_immediate_create_ea_integration();
DROP PROCEDURE IF EXISTS execute_immediate_create_ea_integration();

GRANT EXECUTE TASK ON ACCOUNT TO APPLICATION IDENTIFIER($application_name);
GRANT EXECUTE MANAGED TASK ON ACCOUNT TO APPLICATION IDENTIFIER($application_name);

GRANT USAGE ON WAREHOUSE IDENTIFIER($connector_warehouse) TO APPLICATION IDENTIFIER($application_name);
GRANT USAGE ON DATABASE IDENTIFIER($destination_database) TO APPLICATION IDENTIFIER($application_name);
GRANT USAGE ON SCHEMA IDENTIFIER($destination_database_schema) TO APPLICATION IDENTIFIER($application_name);

GRANT CREATE TABLE ON SCHEMA IDENTIFIER($destination_database_schema) TO APPLICATION IDENTIFIER($application_name);
GRANT CREATE VIEW ON SCHEMA IDENTIFIER($destination_database_schema) TO APPLICATION IDENTIFIER($application_name);

GRANT USAGE ON INTEGRATION IDENTIFIER($external_access_integration_name) TO APPLICATION IDENTIFIER($application_name);
GRANT USAGE ON DATABASE IDENTIFIER($secret_database) TO APPLICATION IDENTIFIER($application_name);
GRANT USAGE ON SCHEMA IDENTIFIER($secret_database_schema) TO APPLICATION IDENTIFIER($application_name);
GRANT READ ON SECRET IDENTIFIER($secret_fqn) TO APPLICATION IDENTIFIER($application_name);

CALL SYSTEM$GRANT_OWNERSHIP_TO_APPLICATION($application_name, true, $destination_database, $destination_schema);

USE APPLICATION IDENTIFIER($application_name);

-- Recommended to call one by one as the response might contain an error
CALL CONFIGURE_CONNECTOR({
   'warehouse': $connector_warehouse,
   'destination_database': $destination_database,
   'destination_schema': $destination_schema
});

CALL SET_CONNECTION_CONFIGURATION({
   'service_now_url': $servicenow_instance_url,
   'secret': $secret_fqn,
   'external_access_integration': $external_access_integration_name
});

-- Remove the 'journal_table' parameter if you don't want to track deleted records
CALL FINALIZE_CONNECTOR_CONFIGURATION({
   'journal_table': 'sys_audit_delete'
});
Copy

后续步骤

安装并配置连接器后,执行“为 ServiceNow® 数据设置数据引入”中描述的步骤。

语言: 中文