将数据插入视图(SQL Server)

时间:2010-11-16 18:33:55

标签: sql-server-2008

我有以下设置:

CREATE TABLE dbo.Licenses
(
 Id    int IDENTITY(1,1) PRIMARY KEY,
 Name  varchar(100),
 RUser nvarchar(128) DEFAULT USER_NAME()
)

GO

CREATE VIEW dbo.rLicenses
AS
SELECT Name
FROM   dbo.Licenses
WHERE  RUser = USER_NAME()

GO

当我尝试使用视图插入数据时...

INSERT INTO dbo.rLicenses VALUES ('test')

出现错误:

Cannot insert the value NULL into column Id, table master.dbo.Licenses; column does not allow nulls. INSERT fails.

为什么尝试使用视图插入时身份列的自动增量不起作用?如何解决?

情景是:

数据库的不同用户应该只能使用该表中自己的行。因此,我试图通过检查用户名来将视图用作一种安全性。有没有更好的解决方案?

8 个答案:

答案 0 :(得分:15)

如何为列命名?

INSERT INTO dbo.rLicenses (name) VALUES ('test')

自从我尝试通过视图进行更新以来,已经过了多年,所以YMMV就像HLGEM所提到的那样。

我会在视图上考虑"INSTEAD OF" trigger以允许触发器中的简单INSERT dbo.Licenses(即表格)

答案 1 :(得分:3)

转到该表的设计。现在,在右侧,将ID列设置为相关列。它现在将自动填充而无需指定。

答案 2 :(得分:2)

您似乎违反了此规则来更新联机丛书中的观看次数: “INSERT语句必须为基础表中的任何列指定不允许空值且没有DEFAULT定义的值。”

答案 3 :(得分:1)

您已创建一个IDPRIMARY KEY的表格,该表格符合UNIQUENOT NULL条件,因此您无法将ID设为{ {1}}通过插入名称字段,因此也应插入NULL

错误消息表明了这一点。

答案 4 :(得分:0)

您的兼容级别设置为什么?如果它是90,它按设计工作。请参阅this article

无论如何,为什么不直接插入表格?

答案 5 :(得分:0)

将'test'插入name会导致将NULL值插入到基表的其他列中,这些列不正确,因为Id是PRIMARY KEY且它不能具有NULL值。

答案 6 :(得分:0)

您只需指定要直接插入的列:

INSERT INTO [dbo].[rLicenses] ([Name]) VALUES ('test')

视图可以像那样挑剔。

答案 7 :(得分:0)

INSERT INTO viewname (Column name) values (value);