Sql server 无法创建链接到Snowflake的服务器

Sql server 无法创建链接到Snowflake的服务器,sql-server,linked-server,snowflake-cloud-data-platform,Sql Server,Linked Server,Snowflake Cloud Data Platform,我遵循了我能找到的所有说明: 已将最新的雪花64位ODBC驱动程序安装到我的SQL Server虚拟机 已为其创建系统dsn,并在用户、服务器、数据库、架构、仓库、角色和跟踪字段中填写 在SQL server中,对于MSDASQL链接服务器提供程序,启用了以下参数:嵌套查询、仅限零级、允许inprocess、支持“Like”运算符 按照说明创建链接服务器 Provider=用于ODBC驱动程序的Microsoft OLE DB提供程序 数据源:我创建的系统DSN的名称 安全: 将本地登录名“NT

我遵循了我能找到的所有说明:

已将最新的雪花64位ODBC驱动程序安装到我的SQL Server虚拟机 已为其创建系统dsn,并在用户、服务器、数据库、架构、仓库、角色和跟踪字段中填写 在SQL server中,对于MSDASQL链接服务器提供程序,启用了以下参数:嵌套查询、仅限零级、允许inprocess、支持“Like”运算符 按照说明创建链接服务器 Provider=用于ODBC驱动程序的Microsoft OLE DB提供程序 数据源:我创建的系统DSN的名称 安全: 将本地登录名“NT AUTHORITY\SYSTEM”映射到远程用户名和密码。当我通过web浏览器连接到Snowflake时,这些用户名和密码有效 单击“使用登录的当前安全上下文创建” 单击“确定”时,出现以下错误
在链接服务器的“安全”选项卡中:

您已映射“NT AUTHORITY\SYSTEM”这是sql服务帐户吗?远程用户名和密码

对于不在您选择的列表中的任何其他登录,将使用该登录的当前安全上下文进行登录

您可以使用windows登录或sql server登录连接到sql server。假设您使用domainxyz\rick或用户名:sqlrick和密码:rick1212。 当您尝试使用链接服务器时,两个可能的登录名domainxyz/rick或sqlrick都没有映射到远程[snowflake]用户名和密码。因此,sql server将通过当前的安全上下文,即您的域XYZ/rick令牌或sqlrick用户名和密码。对于外部服务器,两者都会失败。它们甚至可以工作吗

使用登录名的当前安全上下文创建 指定将使用列表中未定义的登录的当前安全上下文建立连接。如果使用Windows身份验证连接到本地服务器,您的Windows凭据将用于连接到远程服务器。如果使用SQL server身份验证连接到本地服务器,则将使用登录名和密码连接到远程服务器。在这种情况下,远程服务器上必须存在具有完全相同的名称和密码的登录名

您可以将登录名映射到远程雪花用户名和密码,或者选择

对于上面列表中未定义的登录,连接将: 使用此安全上下文创建,并在框中填写snowflake的用户名和密码

/*
snowflake server=xyz12345.west-europe.azure.snowflakecomputing.com
snowflake user= testuser
snowflake password = Testuser1
*/

--system DSN for snowflake named SNOWFLAKEDSN [SnowflakeDSIIDriver, User: testuser, Server:xyz12345.west-europe.azure.snowflakecomputing.com, Database:DEMO_DB, Tracing:4 (default)]
--Note: Attempting any of the commands with a wrong password could lock temporarily the snowflake account. tread carefully


--snowflake without linked server
--openrowset using dsn
SELECT *
FROM OPENROWSET('MSDASQL', 'DSN=SNOWFLAKEDSN;UID=testuser;PWD=Testuser1', 'select cast(TABLE_NAME as varchar(100)) as tablename from demo_db.information_schema.tables');

--openrowset using dsn2 , format= provider, DSN;uid;password, query
SELECT *
FROM OPENROWSET('MSDASQL', 'SNOWFLAKEDSN';'testuser';'Testuser1', 'select cast(TABLE_NAME as varchar(100)) as tablename from demo_db.information_schema.tables');


--openrowset without dsn
SELECT *
FROM OPENROWSET('MSDASQL', 'DRIVER=SnowflakeDSIIDriver;SERVER=xyz12345.west-europe.azure.snowflakecomputing.com;UID=testuser;PWD=Testuser1', 'select cast(TABLE_NAME as varchar(100)) as tablename from demo_db.information_schema.tables');

GO


--linked server using DSN
EXEC master.dbo.sp_addlinkedserver @server = N'SNOWFLAKE_WITH_DSN', @srvproduct=N'', @provider=N'MSDASQL', @datasrc=N'SNOWFLAKEDSN';
 /*every login of the sql instance connects to snowflake as testuser*/
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'SNOWFLAKE_WITH_DSN',@useself=N'False',@locallogin=NULL,@rmtuser=N'testuser',@rmtpassword='Testuser1';


--linked server without DSN, name of linked server is SNOWFLAKE_WITHOUT_DSN
EXEC master.dbo.sp_addlinkedserver @server = N'SNOWFLAKE_WITHOUT_DSN', @srvproduct=N'', @provider=N'MSDASQL', @provstr=N'DRIVER=SnowflakeDSIIDriver;SERVER=xyz12345.west-europe.azure.snowflakecomputing.com';
 /*every login of the sql instance connects to snowflake as testuser*/
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'SNOWFLAKE_WITHOUT_DSN',@useself=N'False',@locallogin=NULL,@rmtuser=N'testuser',@rmtpassword='Testuser1';


--linked server without DSN, hardcoded snowflake creds in the provider string (at own risk)
/*
EXEC master.dbo.sp_addlinkedserver @server = N'SNOWFLAKE_WITHOUT_DSN_HARDCODED_CREDS', @srvproduct=N'', @provider=N'MSDASQL', @provstr=N'DRIVER=SnowflakeDSIIDriver;SERVER=xyz12345.west-europe.azure.snowflakecomputing.com;UID=testuser;PWD=Testuser1';
 /*creds hardcoded in the connection string, logins use their own security context */
/* caveat: this worked ok for windows authenticated logins. sql authenticated logins could not use the linked server, not tested with msdasql in process... */
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'SNOWFLAKE_WITHOUT_DSN_HARDCODED_CREDS',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL;
*/

这里的错误似乎很明显。指定的用户名或密码不正确。看起来很简单,但是我使用的远程uname/pwd的值与我在webSo上登录Snowflake时使用的值相同,如果我在安全对话框的顶部没有定义映射,并且在选中“使用此安全上下文进行设置”后只放入Snowflake远程登录凭据,那么应该可以工作吗?我仍然收到相同的无效凭据错误。奇怪的是,我在c:\users\my.name\Snowflake ODBC Driver\log文件夹中也没有看到任何文件。顺便说一句,这就是Windows server 2019中的Sql server 2014是的,这就是想法。如果您想在不创建linkedserver的情况下测试您的系统dsn和用户名与密码,您可以在ssms中执行以下命令Yourxxx是不言自明的。如果dsn、用户名和密码正确,您应该会得到一个与数据源和身份验证无关的结果或错误:`select*from openrowset'MSDASQL','dsn=yourdsname;user_id=您的用户名;password=yourspassword','select*from information_schema.tables'`swonflake odbc提供程序需要一个pwd,以下内容对我有用:从openrowset'MSDASQL'中选择*,'dsn=SNOWFLAKEDSN;uid=testuser;pwd=Testuser1',“从demo_db.information_schema.tables中选择castTABLE_NAME作为varchar100作为tablename。tables”编辑了答案,添加了tsql,用于使用openrowset测试雪花并创建雪花链接服务器。嗯,这看起来就是答案。我现在有一个不同的问题,但我不认为它与连接有关。当我使用参数运行openrowset命令时,我现在得到:共享数据库不再可用。如果出版商再次提供,则需要重新创建。。