对文字感到抱歉,尽量简洁
我们正在尝试建立一个流程,让使用访问数据库的最终用户(在不同网络之间移动的笔记本电脑上的远程用户)向我们的 SQL 服务器发送请求,让该服务器执行存储过程。在 SQL Server 收到此请求后,服务器应查找该用户的一系列预期值,然后执行不同的存储过程以启动返回到调用设备的新链接(基于它与 Internet 的连接方式这次),对该机器上的数据运行一系列验证,如果验证成功,它应该更新远程客户端上的表中的数据,然后断开连接。
当我们直接使用 SSMS 从 SQL Server 执行调用过程时,我们已经设置并正常工作(例如:我们登录到运行 SQL Server 的服务器,然后使用 SSMS 执行存储过程),如果我们离开那里的链接我们可以使用 SSMS 读取/编辑/修改远程客户端中的任何数据/表。但是,当从远程客户端调用存储过程时,它们可以工作,除非这些存储过程尝试读取/写入远程链接服务器(例如:添加和删除到数据库的链接的存储过程工作正常,但是看起来的查询at 或编辑远程数据库中的数据会返回一个错误,看起来它与与文件访问相关的权限有关)。
我们的环境:设备在我们的域上,SQLserver 2017 Express,Windows 10,accdb 数据库(2007)
总结:我们正在编写 VBA 代码来在我们的域上执行远程 SQL Server 2017 Express 存储过程,以更新在 Windows 10 计算机上运行的同一个调用 accdb 数据库 (2007) 中的表。结果:我们希望远程机器只在 sql server 上运行存储过程,而不是为了增加安全性和效率而没有特定的表/视图。即访问vba 说我在线,sql server 创建链接并检查更新的联系人、下载和断开连接。过程创建一个链接服务器(sp_addlinkedserver),登录(sp_addlinkedsrvlogin),更新一个表(@sql = 'UPDATE'),删除链接(sp_dropserver)一旦我们有了这个工作,我们计划创建其他存储过程来查询accdb文件并上传新数据到 SQL 服务器。
所以,在我们目前拥有的 SQL 服务器上
CREATE PROCEDURE [dbo].[SQLserverlastconnect] @p_linkservername nvarchar(max) = null, @p_linkdatasrc nvarchar(max) = NULL
AS
DECLARE @sql NVARCHAR(MAX)
EXEC master.dbo.sp_addlinkedserver @server = @p_linkservername, @srvproduct=N'', @provider=N'Microsoft.ACE.OLEDB.12.0', @datasrc= @p_linkdatasrc
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'<servername>\<instance>', @locallogin = NULL , @useself = N'True';
SET @sql = 'UPDATE ' + @p_linkservername + '...tbl_Ref_Local SET tqs_Data = ''' + CONVERT(varchar(50),FORMAT(CURRENT_TIMESTAMP, 'yyyy-MM-dd hh:mm:ss')) + ''' WHERE tqs_KeyIdentifier = ''LastConnect'''
EXEC(@sql)
EXEC master.sys.sp_dropserver @p_linkservername,'droplogins'
在 Access 365 中,我们有一个 Sub(尝试了许多更改,包括查找连接字符串的问题)
Sub Test()
Dim connection As Object: Set connection = CreateObject("ADODB.Connection")
Dim rs As Object: Set rs = CreateObject("ADODB.Recordset")
With connection
.ConnectionString = "DRIVER=SQL Server;Server=<servername>\<Instance>;Trusted_Connection=Yes;APP=2007 Microsoft Office system;DATABASE=SixBit;User ID=sa;Password=********" ‘[we tried to remove User ID/Password and only use a trusted connection]
.CommandTimeout =0
.Open
End With
Set rs = connection.Execute("EXEC dbo.SQLserverlastconnect @p_linkservername = N'Test7', @p_linkdatasrc = N'\\fileserver\Programming\TQS - Client 0.03.22.accdb'")
‘tried this also Set rs = connection.Execute("INSERT INTO [Test7]...[tbl_Ref_Local] ([tqs_KeyIdentifier],[tqs_Data],[tqs_GUID]) VALUES ('t', 't' ,'t')")
connection.Close: Set rs = Nothing: Set connection = Nothing
End Sub
我们尝试过的事情:我们已将所有人添加到文件所在的网络共享中,将所有人添加到临时路径,将 SQL 服务器服务“登录身份”从默认更改为域管理员以及“网络服务”。我们没有花太多时间的一个领域是 SQL 服务器上链接服务器属性上的“登录映射”(我们确实尝试过模拟“sa”)这是我们在运行 VBA 时得到的当前消息。尝试设置 NET USE U:,尝试指向另一个未打开的访问数据库(旧版本),因为该消息似乎暗示我们无法在数据库运行时打开该数据库,还尝试了一个文本文件。
最后,我们创建了一个触发器,并且可以让它运行一个 SELECT(很多拳头抽),但不是一个 UPDATE 或 INSERT(悲伤的脸),但这可能向那里的人表明一些东西。
有没有人有任何建议?