2010-11-16 91 views
14

我有以下设置:中插入数据视图(SQL Server)的

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. 

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

的情况是:

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

+1

为什么不直接插入该表中?我从不插入视图,因为他们的规则更加奇特,而且比直接插入更加痛苦。 – HLGEM 2010-11-16 18:38:25

+1

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

+1

@Keeks;你的代码在SQL Server 2014和SQL Server 2016上运行良好ctp 2.3 – 2015-10-21 13:01:56

回答

0

您的兼容级别设置为?如果它是90,它按照设计工作。见this article

在任何情况下,为什么不直接插入表中?

2

看起来像是违反了此规则来更新来自联机丛书的视图: “INSERT语句必须为基础表中不允许空值且没有DEFAULT定义的任何列指定值。

+0

好吧,因为行为是有意的,你有任何想法我可以解决我的问题吗? – Keeks 2010-11-16 18:46:42

+2

直接插入基础表 – HLGEM 2010-11-16 19:09:22

15

怎么样命名你的列?

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

自从我尝试通过YMMV作为HLGEM提到的视图更新以来,已经有好几年了。

我将在视图上考虑一个"INSTEAD OF" trigger,以允许简单INSERT dbo.Licenses(即表)在触发

0

插入“测试”来命名将导致插入NULL值到基表的其他列,其不会请正确,因为Id是PRIMARY KEY,它不能有NULL的值。

3

转到该表的设计。现在,在右侧,将ID列设置为有问题的列。现在它将自动填充而没有规定。

1

您已经创建了ID表作为PRIMARY KEY,满足UNIQUENOT NULL的限制,所以你不能插入名称字段使ID作为NULL,所以ID也应插入。

错误消息指出这一点。

0

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

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

视图可以挑剔这样。