Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 强制Access忘记链接表的用户名和密码_Sql Server_Vba_Ms Access_Azure Sql Database - Fatal编程技术网

Sql server 强制Access忘记链接表的用户名和密码

Sql server 强制Access忘记链接表的用户名和密码,sql-server,vba,ms-access,azure-sql-database,Sql Server,Vba,Ms Access,Azure Sql Database,我有一个MS Access数据库,它通过链接服务器连接到SQL server 使用修改后的attachdsnlestable过程添加链接表: stConnect=“ODBC;DRIVER=“&stDriverName&”SERVER=“&stServer&”DATABASE=“&stDatabase&”UID=“&stUsername&”PWD=“&stPassword 设置td=CurrentDb.CreateTableDef(stLocalTableName) td.SourceTableN

我有一个MS Access数据库,它通过链接服务器连接到SQL server

使用修改后的
attachdsnlestable
过程添加链接表:

stConnect=“ODBC;DRIVER=“&stDriverName&”SERVER=“&stServer&”DATABASE=“&stDatabase&”UID=“&stUsername&”PWD=“&stPassword
设置td=CurrentDb.CreateTableDef(stLocalTableName)
td.SourceTableName=stRemoteTableName
td.Connect=stConnect
CurrentDb.TableDefs.Append td
我在应用程序中有更改登录用户的功能,这将删除所有TableDef:

CurrentDb.TableDefs中每个td的

如果td.Name=stLocalTableName,则
CurrentDb.TableDefs.Delete stLocalTableName
如果结束
下一个
然后,它将使用上述过程重新添加

但是,现在这似乎起作用了,如果我以
user1
身份登录,然后在不关闭访问权限的情况下将用户更改为
user2
。连接是使用
user1
凭据进行的,运行一个包含
SUSER\u NAME()
的视图显示
user1
是登录用户

有没有办法强制重置连接或强制更改用户

编辑

我的整个登录功能:

函数attachdsnlestable(stLocalTableName为字符串,stRemoteTableName为字符串,stDriverName为字符串,stServer为字符串,stDatabase为字符串,可选stUsername为字符串,可选stPassword为字符串)
错误转到AttachDSNLessTable\u Err
将td设置为TableDef
以字符串形式连接
对于CurrentDb.TableDefs中的每个td
如果td.Name=stLocalTableName,则
CurrentDb.TableDefs.Delete stLocalTableName
退出
如果结束
下一个
如果Len(stUsername)=0,则
“//如果未提供stUsername,请使用受信任的身份验证。
stConnect=“ODBC;DRIVER=“&stDriverName&”SERVER=“&stServer&”DATABASE=“&stDatabase&”Trusted\u Connection=Yes”
其他的
“//警告:这将保存用户名和密码以及链接的表信息。
stConnect=“ODBC;DRIVER=“&stDriverName&”SERVER=“&stServer&”DATABASE=“&stDatabase&”UID=“&stUsername&”PWD=“&stPassword
如果结束
设置td=CurrentDb.CreateTableDef(stLocalTableName)
td.SourceTableName=stRemoteTableName
td.Connect=stConnect
CurrentDb.TableDefs.Append td
AttachDSNLessTable=“”
退出功能
附件SNLESSTABLE\u错误:
AttachDSNLessTable=错误说明
端函数
编辑

我花了一段时间才意识到这一点。您的问题是Access在每个{server,database}基础上缓存连接。无法清除此缓存(据我所知)

但是有一个解决办法:答案是使连接唯一,即使服务器或数据库细节没有改变

使用DSN文件 您不能更改数据库名称或服务器名称以使连接唯一,但可以更改DSN文件名,Access会将连接视为“唯一”/“新连接”

如果使用相同的DSN文件,连接将再次缓存,因此每次登录尝试都必须使用不同的DSN文件

这是一个通用功能,允许用户登录或注销您的系统。每次登录都将生成一个新的DNS文件,并与您的DB=>建立一个新连接,允许您登录的用户成为新用户

下面的函数只是概念性的。根据你的需要改变 并添加错误陷阱

公共函数FN\u创建\u DNS\u文件()
Const Server As String=“”服务器
常量驱动程序作为字符串=“驱动程序”
Const Port As String=“”端口
常量数据库为字符串=“数据库”
作为字符串的Dim DsnFileName
作为对象的Dim Fso
将DnsFile设置为对象
设置Fso=CreateObject(“Scripting.FileSystemObject”)
DsnFileName=VBA.environment$(“temp”)和“\”&VBA.Format(Now(),“yyyy-mm-dd”和“.dsn”
Set DnsFile=Fso.CreateTextFile(DsnFileName)
DnsFile.WriteLine“[ODBC]”
DnsFile.WriteLine“DRIVER=”&驱动程序
DnsFile.WriteLine“PORT=”&端口
DnsFile.WriteLine“DATABASE=”&数据库
DnsFile.WriteLine“SERVER=”&SERVER
'关闭文件并清理
DnsFile.关闭
设置Fso=无
设置DnsFile=Nothing
FN\u创建\u DNS\u文件=DsnFileName
端函数
公共功能注销()
将Qdf设置为QueryDef
对于CurrentDb.QueryDefs中的每个Qdf
如果(VBA.InStr(Qdf.Connect,“ODBC”))>0,则
Qdf.Connect=“ODBC;”如果不需要此对象,请删除,或者设置为空连接字符串
如果结束
下一个Qdf
端函数
公共函数登录(stUsername为字符串,stPassword为字符串)
将Tdf调暗为TableDef
将Qdf设置为QueryDef
以字符串形式连接
Dim ConForQuery作为字符串
尺寸I为整数:I=0
作为字符串的Dim DsnFileName
错误转到AttachDSNLessTable\u Err
'生成具有新文件名的新DNS文件以使访问连接唯一
DsnFileName=FN\u创建\u DNS\u文件()
stConnect=“ODBC;自动重新连接=1;无提示=1”
如果Len(stUsername)=0,则
“//如果未提供stUsername,请使用受信任的身份验证。
stConnect=stConnect&“受信任的连接=是”
ConForQuery=stConnect
其他的
“//警告:这将保存用户名和密码以及链接的表信息。
stConnect=stConnect&“UID=“&stUsername&”PWD=“&stPassword
ConForQuery=stConnect&“UID=“&stUsername
如果结束
ConForQuery=ConForQuery&“;”&“FILEDSN=”&DsnFileName
stConnect=stConnect&“;”&“FILEDSN=”&DsnFileName
错误时转到错误\u无效\u登录
'更新所有链接表
对于CurrentDb.TableDefs中的每个Tdf
如果(VBA.InStr(Tdf.Connect,“ODBC”))>0,则
连接=
"ODBC;Driver=SQL Server;MyUniqueTag=" & stUserName & ";UID=" & stUserName