Вставить данные в представление (SQL Server) - PullRequest
16 голосов
/ 16 ноября 2010

У меня есть следующие настройки:

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.

Почему автоматическое увеличение столбца идентификаторов не работает при попытке вставить с использованием представления и как я могу это исправить?

Сценарий:

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

Ответы [ 7 ]

15 голосов
/ 17 ноября 2010

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

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

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

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

3 голосов
/ 25 октября 2012

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

2 голосов
/ 16 ноября 2010

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

1 голос
/ 03 января 2013

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

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

0 голосов
/ 03 апреля 2017

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

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

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

0 голосов
/ 02 апреля 2012

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

0 голосов
/ 16 ноября 2010

Каков ваш уровень совместимости? Если это 90, он работает как задумано. См. эту статью .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...