2010-11-16 19 views
14

Ho la seguente configurazione:Inserire i dati in vista (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 

Quando provo ad inserire i dati usando la vista ...

INSERT INTO dbo.rLicenses VALUES ('test') 

si pone un errore:

Cannot insert the value NULL into column Id, table master.dbo.Licenses; column does not allow nulls. INSERT fails. 

Perché l'incremento automatico della colonna Identity non funziona quando si tenta di inserire utilizzando la vista e come posso risolverlo?

Scenario è:

I diversi utenti del database dovrebbero essere solo in grado di lavorare con le proprie righe in quella tabella. Pertanto sto cercando di utilizzare la vista come una sorta di sicurezza controllando il nome utente. Esiste una soluzione migliore?

+1

Perché non si inserisce direttamente in quel tavolo? Non inserisco mai le visualizzazioni perché hanno strane regole bizzarre e sono più dolorose di un inserto diretto. – HLGEM

+1

I diversi utenti del database dovrebbero essere in grado di lavorare con le proprie righe in quella tabella. Pertanto sto cercando di utilizzare la vista come una sorta di sicurezza controllando il nome utente. C'è una soluzione migliore? – Keeks

+1

@Keeks; il tuo codice funziona bene su SQL Server 2014 e SQL Server 2016 ctp 2.3 –

risposta

0

A cosa è impostato il livello di compatibilità? Se è 90, funziona come progettato. Vedi this article.

In ogni caso, perché non inserire semplicemente direttamente nel tavolo?

2

Sembra che si stia eseguendo il comando di questa regola per l'aggiornamento delle viste dalla documentazione in linea: "Le istruzioni INSERT devono specificare i valori per qualsiasi colonna nella tabella sottostante che non consente valori nulli e non hanno definizioni DEFAULT."

+0

Ok, dato che il comportamento è intenzionale hai qualche idea su come posso risolvere il mio problema? – Keeks

+2

Inserire direttamente nella tabella sottostante – HLGEM

15

Che dire nominare la colonna?

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

Sono passati anni da quando ho tentato di aggiornare tramite una vista così YMMV come HLGEM menzionato.

riterrei un "INSTEAD OF" trigger sulla vista per consentire un semplice INSERT dbo.Licenses (cioè la tabella) nel trigger

0

Inserimento 'prova' a nome porterà ad inserire NULL valori alle altre colonne della tabella di base che suole essere corretto poiché Id è un PRIMARY KEY e non può avere il valore NULL.

3

Vai a progettare per quella tabella. Ora, a destra, imposta la colonna ID come colonna in questione. Ora verrà compilato automaticamente senza specifiche.

1

È stato creato un tavolo con ID come PRIMARY KEY, che soddisfa UNIQUE e NOT NULL vincoli, quindi non è possibile fare il ID come NULL inserendo campo del nome, in modo da ID dovrebbe essere inserito anche.

Il messaggio di errore indica questo.

0

Hai solo bisogno di specificare quali colonne si sta inserendo direttamente in:

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

Le viste possono essere schizzinosi così.

Problemi correlati