Access 2003中的链接SQL表(!)不可更新

时间:2016-04-19 19:15:56

标签: permissions sql-server-2008-r2 ms-access-2003 database-permissions

我目前正在使用旧版应用程序,将Access 2003升级为链接到SQL Server表(2008 R2或更高版本)。对于按代码链接的表,我可以插入,但不能更新或删除。我已尝试过网络上的所有内容,没有骰子。详情如下。

简洁而不是tl;博士

首先使用升迁向导创建表。在使用中,app必须连接到同一模式中的不同模式,因此不能只是设置和忘记。虽然可以使用DSN文件,但无法进行本地DSN,许多安装。但问题也存在,DSN没有找到。详情稍后。

在休息之前:很快我将这个应用程序更新到Access 2016左右。如果这个不够/更容易,我会等几天。也许有人可以建议最好的改造。

*问题详情请参阅*

使用DSN和UI链接表格,我得到一个可编辑的表格。乌拉。

但是当我使用下面的代码(在每个refsite上找到)时,链接已经完成,但只选择和插入工作。无论如何,其他所有失败的失败都会失败。

Public Function LinkToSqlTable(sqlInstance As String, sqlDb As String, 
    sqlTableName As String, localTableName As String)  

Dim linked As New TableDef

' ***factored-out functionality, known to work: reader can ignore*** '
DeleteTable localTableName

' connection-string steps, placeholders replaced by args '
Dim sCnx As String
sCnx = "ODBC;Driver=SQL Server;Server=_instance_;" & _
    "Database=_db_;Integrated Security=SSPI"
sCnx = Replace(sCnx, "_instance_", sqlInstance)
sCnx = Replace(sCnx, "_db_", sqlDb)


' linked-table steps '
Set linked = CurrentDb.CreateTableDef(localTableName)
linked.Connect = sCnx
linked.SourceTableName = sqlTableName
CurrentDb.TableDefs.Append linked


' ui '
RefreshDatabaseWindow

End Function

* ID列或权限? *

我认为问题是最初缺少身份栏,我添加了一个,但没有变化。至少现在我有一个像我应该的PK领域。 ; - )

当我手动链接表时,UI需要知道ID列。它还可以吗?很好,但我如何在代码中设置它?搜索没有透露任何内容。

我认为它是网站等所说的权限。我还采取了我能想到的所有步骤来解决这个问题。没有骰子。

*我尝试过的事情*

除了我之前说的ID列之外,这些东西(不按顺序):

  • 由于DSN保存为文件,因此尝试在cnx字符串中使用它作为exampled。失败。
  • 使用过的DSN内容,仔细筛选&翻译,在cnx字符串中。失败。
  • 我使用DSN手动连接的表中使用的连接字符串。失败。
  • 在所有主要选项中更改了cnx字符串中的驱动程序,甚至省略了它。失败。
  • 将cnx中的安全性更改为Integrated Security = SSPI和其他选项,并完全省略。失败。
  • 我添加了我的实际本地用户作为exampled,有和没有密码。失败。

(之前的几个选项尝试使用之前的选项,但不是100%覆盖率。)

  • 在SQL Server中,使用SSMS,我尝试了安全功能:
    • 在实例中添加了SQS身份验证登录
    • 将用户与此处显示的默认数据库匹配
    • 在这里给登录用户读取和写入权限(有时候加上其他人)
    • 添加了匹配ID& pw到cnx字符串。失败。
  • 我尝试在SQS中设置这个数据库,暂时让所有人都做“安全”。失败。

  • 这个,那个,另一个。一切都失败了!!

所以权限问题?有些方法毕竟使用DSN文件?我的cnx字符串中的权限设置不匹配?愚蠢的疏忽?还有其他我错过的东西?我在SQL Server和Access方面都非常擅长,但只有在安全性和连接字符串的基本级别才是魔鬼。

*检索到的表格属性*

以防万一他们提供帮助,我检索了这些(在添加到TableDefs集合中的对象之后)。

**这个在UI中完成,使用DSN和this-is-ID-field,可以进行编辑:**

Name = dbo_tblSendTo
Updatable = False
DateCreated = 4/19/2016 11:11:40 AM
LastUpdated = 4/19/2016 11:11:42 AM
Connect = ODBC;Description=SQL Server tables for TeleSales 5;DRIVER=SQL Server Native Client 10.0;SERVER=(local)\sqlexpress;Trusted_Connection=Yes;APP=Microsoft Office 2003;WSID=CMSERVER;DATABASE=TS5_General;
Attributes = 536870912
SourceTableName = dbo.tblSendTo
RecordCount = -1
ValidationRule = 
ValidationText = 
ConflictTable = 
ReplicaFilter = 

**这一个,来自通过代码链接的表,没有:**

Name = tblSendTo
Updatable = False
DateCreated = 4/19/2016 11:17:51 AM
LastUpdated = 4/19/2016 11:17:51 AM
Connect = ODBC;Description=SQL Server tables for TeleSales 5;DRIVER=SQL Server Native Client
    > 10.0;SERVER=(local)\sqlexpress;Trusted_Connection=Yes;APP=Microsoft Office 2003;WSID=CMSERVER;DATABASE=TS5_General;
Attributes = 536870912
SourceTableName = dbo.tblSendTo
RecordCount = -1
ValidationRule = 
ValidationText = 
ConflictTable = 
ReplicaFilter =

*我的请求

所以.....请有人帮助我。我不喜欢像这样感到愚蠢,遗憾的是我需要这样做,而不是用.NET代码或类似代码替换它。

谢谢,任何能够......的人 编

1 个答案:

答案 0 :(得分:1)

唉,我能够回答我自己的问题。

自首次发布回复HansUp的评论后编辑了一点

我在表中添加了一个无法编辑的标识列。但是,我没有将设置为主键。事实证明,使用identity并不能自动创建主键。

但后者使用2种可能的DDL语法中的任何一种使其成为主键是至关重要的。由于我认为我已经处理了没有唯一密钥问题的没有编辑,我专注于权限。

然后,这里的所有权限都只是一个副作用。

这样做的结果是确保添加标识列 并使其成为主键 ,如果由于某种原因您的原始表架构没有那个。

如果我有时间,我会修剪问题以反映我发现的内容。