Вставка данных в представление (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')
Представления могут быть разборчивы.