我有以下设置:
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.
为什么尝试使用视图插入时身份列的自动增量不起作用?如何解决?
情景是:
数据库的不同用户应该只能使用该表中自己的行。因此,我试图通过检查用户名来将视图用作一种安全性。有没有更好的解决方案?
答案 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)
您已创建一个ID
为PRIMARY KEY
的表格,该表格符合UNIQUE
和NOT 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);