【问题标题】:SQL Server IDENTITY_INSERT Cannot find the object "TableName"SQL Server IDENTITY_INSERT 找不到对象“TableName”
【发布时间】:2017-09-12 18:49:13
【问题描述】:

当我在 java netbeans 中运行时:

executeUpdate("INSERT INTO TableName (id, name) VALUES (1, 'Name1')")

我得到错误:

当 IDENTITY_INSERT 设置为 OFF 时,无法为表“TableName”中的标识列插入显式值

如果我跑:

executeUpdate("SET IDENTITY_INSERT TableName ON;INSERT INTO TableName (id,name) VALUES (1,'Name1');SET IDENTITY_INSERT TableName OFF;") 

我收到此错误:

找不到对象“TableName”,因为它不存在或您没有权限。

为什么会发生这种情况,我该如何解决?

【问题讨论】:

  • 为什么要在 id 列中输入显式值?如果你想这样做,那为什么要创建一个身份类型呢?
  • 看起来是权限问题。确保登录 / 用户对该表具有适当的权限,快速检查是使该用户成为 dbowner。
  • 只有管理员才能将身份属性设置为开启。这样做时,数据完整性问题的可能性很大。这不是推荐的做法。那么你为什么要设置 id 值呢?
  • 我支持一个遗留项目。它是这样来的

标签: sql-server identity-insert


【解决方案1】:

IDENTITY 属性做它应该做的事情,只传递名称。除非您尝试将特定 ID 与名称相关联,否则无需显式尝试传入 ID,在其中您必须跟上已使用和未使用的值,然后 IDENTITY 将是无用。在这种情况下,我只需在 ID 列上添加一个唯一约束。

INSERT INTO TableName (name) VALUES ('Name1')

【讨论】:

  • 没办法;有时必须明确设置身份。
  • 没有证据证明您的主张,违反了所有最佳实践
  • 有时需要将标识值插入数据库。
【解决方案2】:

【讨论】:

  • 这是一个糟糕的主意,因为任何尝试此操作的用户都必须这样做。它还允许他们更改您当前编写的其他对象。这就像用 500 磅的炸弹而不是锤子敲钉子
  • 如果您授予所有用户访问数据库的权限,那么您已经遇到了问题。我们始终为每个后台服务使用一个技术用户。只有这个“用户”有权更改数据。
  • 好主意。现在您无法审核谁更改了什么。
  • 我们的应用程序进行审计。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多