2010-11-16 3 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

+1

Различные пользователи базы данных должны работать только со своими строками в этой таблице. Поэтому я пытаюсь использовать представление как вид безопасности, проверяя имя пользователя. Есть ли лучшее решение? – Keeks

+1

@ Keeks; ваш код отлично работает на SQL Server 2014 и SQL Server 2016 ctp 2.3 –

ответ

0

Какой уровень совместимости установлен? Если это 90, он работает как разработанный. См. this article.

В любом случае, почему бы просто не вставить прямо в стол?

2

Похоже, вы используете это правило для обновления представлений из книг в Интернете: «Операторы INSERT должны указывать значения для любых столбцов в базовой таблице, которые не допускают нулевые значения и не имеют определений DEFAULT».

+0

Хорошо, так как поведение преднамеренно, есть ли у вас какие-либо идеи, как я мог бы решить свою проблему? – Keeks

+2

Вставьте непосредственно в базовую таблицу – HLGEM

15

Как насчет названия вашей колонки?

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

Прошло много лет с тех пор, как я попробовал обновить изображение, поэтому YMMV упоминается как HLGEM.

Я бы рассмотреть "INSTEAD OF" trigger на представлении, чтобы простой INSERT dbo.Licenses (т.е. таблицу) в триггере

0

Вставка «тест», чтобы имя приведет к вставке NULL значения других столбцов базовой таблицы, привычка быть правильным, поскольку Id - PRIMARY KEY, и он не может иметь значение NULL.

3

Перейти к оформлению для этого стола. Теперь, справа, установите столбец идентификатора в качестве столбца, о котором идет речь. Он будет автоматически заполняться без спецификации.

1

Вы создали таблицу с ID в PRIMARY KEY, которая удовлетворяет UNIQUE и NOT NULL ограничений, так что вы не можете сделать ID как NULL, вставив имя поля, поэтому ID должен также быть вставлен.

Это сообщение об ошибке сообщает об этом.

0

Вам просто нужно указать, какие столбцы вы вставку непосредственно в:

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

Представление может быть разборчиво, как это.

Смежные вопросы