运行初始 SQL
注意:Tableau Prep Builder 版本 2019.2.2 及更高版本支持使用初始 SQL,但尚不支持 Tableau Desktop 支持的所有相同选项。有关将初始 SQL 与 Tableau Prep Builder 结合使用的信息,请参见 Tableau Prep Builder 联机帮助中的使用初始 SQL 查询连接(链接在新窗口中打开)。
连接到某些数据库时,您可以指定连接到数据库(例如,打开工作簿、刷新数据提取、登录到 Tableau Server 或发布到 Tableau Server)时运行的初始 SQL 命令。刷新视图时不会运行初始 SQL。请注意,此初始 SQL 与自定义 SQL 连接不同。自定义 SQL 连接定义针对其发出查询的关系(或表)。有关详细信息,请参见连接到自定义 SQL 查询。
可使用此命令:
设置将在会话期间使用的临时表。
设置自定义数据环境。
您可以在“服务器连接”对话框中或在“数据源”页上选择添加初始 SQL 命令。
注意:如果您的数据源支持运行初始 SQL 语句,则“服务器连接”对话框的左下角中会出现“初始 SQL”链接。有关数据源的信息,请参见支持的连接器。
使用初始 SQL
在“服务器连接”对话框上,单击“初始 SQL”。或者,在“数据源”页面上,选择“数据”>“初始 SQL”或“数据”>“查询分段和初始 SQL”,具体取决于您要连接的数据库。
在“初始 SQL”对话框中输入 SQL 命令。可使用“插入”下拉菜单将参数传递给数据源。
注意: Tableau 不会检查语句有无错误。在连接时,此 SQL 语句直接发送到数据库。
您的软件许可证可能会限制您针对连接使用初始 SQL。如果发布到 Tableau Server,则必须对该服务器进行配置以允许使用“初始 SQL”语句。默认情况下,已将服务器软件配置为在 Web 浏览器加载工作簿时允许运行这些语句。
管理员可通过使用 tsm configuration set
命令将服务器配置为忽略初始 SQL 语句:
tsm configuration set -k vizqlserver.initialsql.disabled -v true
如果服务器不允许使用初始 SQL 语句,则该工作簿仍会打开,但不会发送初始 SQL 命令。
有关 tsm configuration set
命令的详细信息,请参见 Tableau Server 帮助(链接在新窗口中打开)。
初始 SQL 语句中的参数
您可以将参数传递给初始 SQL 语句中的数据源。这之所以很有用,有以下几个原因:
您可以使用 TableauServerUser 或 TableauServerUserFull 参数配置模拟。
如果您的数据源支持此功能,则可以设置行级别安全性(例如,针对 Oracle VPD 或 SAP Sybase ASE),以确保用户只看到他们有权看到的数据。
您可以在日志记录中提供更多详细,例如,Tableau 版本或工作簿名称。
初始 SQL 语句中支持以下参数:
参数 | 描述 | 返回值的示例 |
TableauServerUser | 当前服务器用户的用户名。在服务器上设置模拟时使用。如果用户未登录到 Tableau Server,则返回空字符串。 | jsmith |
TableauServerUserFull | 当前服务器用户的用户名和域。在服务器上设置模拟时使用。如果用户未登录到 Tableau Server,则返回空字符串。 | domain.lan\jsmith |
TableauApp | Tableau 应用程序的名称。 | Tableau Desktop Professional Tableau Server |
TableauVersion | Tableau 应用程序的版本。 | 9.3 |
WorkbookName | Tableau 工作簿的名称。仅用于具有嵌入式数据源的工作簿。 | Financial-Analysis |
警告:Tableau Desktop 不包含域。如果您不使用委派并设置 tsm configuration set -k DelegationUseFullDomainName=-v true--force-keys,则可以包括它
以下示例显示可以在初始 SQL 语句中使用参数的不同方式。
- 本示例在 Microsoft SQL Server 上设置安全上下文:
EXECUTE AS USER = [TableauServerUser] WITH NO REVERT;
本示例表明如何在 DataStax 的数据源上使用参数将详细信息添加到日志记录或设置会话变量来跟踪数据:
SET TABLEAUVERSION [TableauVersion];
本示例可用于帮助设置 Oracle VPD 的行级别安全性:
begin
DBMS_SESSION.SET_IDENTIFIER([TableauServerUser]);
end;
注意:Oracle PL/SQL 代码块需要一个尾随分号来终止代码块。请查阅 Oracle 文档以了解正确的语法。
针对服务器延迟执行
您可以延迟初始 SQL 语句,以便只在服务器上执行该语句。针对服务器延迟执行的一个原因是您没有权限执行设置模拟的命令。使用 <ServerOnly></ServerOnly> 标记将只在服务器上执行的命令括起来。
示例:
CREATE TEMP TABLE TempTable(x varchar(25)); INSERT INTO TempTable VALUES (1); <ServerOnly>INSERT INTO TempTable Values(2);</ServerOnly>
安全性和模拟
如果在初始 SQL 语句中使用 TableauServerUser 或 TableauServerUserFull 参数,则您将创建一个不能与其他用户共享的专用连接。这也将限制缓存共享,从而可以增强安全性,但也可能会降低性能。
MySQL 和 Oracle 连接的“创建表”疑难解答
对于 MySQL 连接,在使用初始 SQL 创建表后,表未列出
连接到 MySQL 时,如果运行类似于如下的初始 SQL 语句,则表可能会由于 Tableau 构建查询的方式而无法显示:
CREATE TABLE TestV1.testtable77(testID int);
若要解决此问题,请向 SQL 语句中添加 IF NOT EXISTS
:
CREATE TABLE IF NOT EXISTS TestV1.TestTable(testID int);
对于 Oracle 连接,使用初始 SQL 创建表会导致 Tableau 停止响应
当您连接到 Oracle 并运行类似于如下的初始 SQL 语句时,Tableau 会由于其构建的查询方式而停止响应,并显示不断旋转的滚轮:
CREATE TABLE TEST_TABLE (TESTid int)
若要解决此问题,请使用以下 SQL 语句:
BEGIN EXECUTE IMMEDIATE 'create table test_table(testID int)'; EXCEPTION WHEN OTHERS THEN NULL; END;