Вставка данных в представление (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

Как насчет назначения столбца?

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

Это сообщение об ошибке указывает на это.

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

Представления могут быть разборчивы.