2010-11-16 64 views
14

tôi đã thiết lập sau:Chèn dữ liệu vào một cái nhìn (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 

Khi tôi cố gắng để chèn dữ liệu sử dụng giao diện ...

INSERT INTO dbo.rLicenses VALUES ('test') 

một lỗi phát sinh:

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

Tại sao tăng tự động của cột nhận dạng không hoạt động khi cố gắng chèn bằng chế độ xem và cách khắc phục?

Kịch bản là:

Người sử dụng khác nhau của cơ sở dữ liệu chỉ có thể làm việc với hàng riêng của họ trong bảng đó. Vì vậy, tôi đang cố gắng sử dụng chế độ xem như một loại bảo mật bằng cách kiểm tra tên người dùng. Có giải pháp nào tốt hơn không?

+1

Tại sao bạn không trực tiếp chèn vào bảng đó? Tôi không bao giờ chèn vào quan điểm bởi vì họ có quy tắc quirly kỳ quặc và có nhiều đau hơn là chèn trực tiếp. – HLGEM

+1

Những người dùng khác nhau của cơ sở dữ liệu chỉ có thể làm việc với các hàng của riêng họ trong bảng đó. Vì vậy, tôi đang cố gắng sử dụng chế độ xem như một loại bảo mật bằng cách kiểm tra tên người dùng. Có giải pháp nào tốt hơn không? – Keeks

+1

@Keeks; mã của bạn chạy tốt trên SQL Server 2014 và SQL Server 2016 ctp 2.3 –

Trả lời

0

Mức độ tương thích của bạn được đặt thành? Nếu đó là 90, nó hoạt động như được thiết kế. Xem this article.

Trong mọi trường hợp, tại sao không chỉ chèn trực tiếp vào bảng?

2

Có vẻ như bạn đang chạy afoul quy tắc này để cập nhật lượt xem từ Sách trực tuyến: "câu lệnh INSERT phải chỉ định giá trị cho bất kỳ cột nào trong bảng bên dưới không cho phép giá trị null và không có định nghĩa DEFAULT."

+0

Ok, vì hành vi là cố ý bạn có bất kỳ ý tưởng làm thế nào tôi có thể giải quyết vấn đề của tôi? – Keeks

+2

Chèn trực tiếp vào bảng bên dưới – HLGEM

15

Còn việc đặt tên cho cột thì sao?

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

Đã nhiều năm kể từ khi tôi thử cập nhật qua chế độ xem để YMMV như HLGEM đã đề cập.

tôi sẽ xem xét một "INSTEAD OF" trigger trên nhằm cho phép một đơn giản INSERT dbo.Licenses (tức là bảng) trong cò

0

Chèn 'test' tên sẽ dẫn đến chèn NULL giá trị cho các cột khác của bảng cơ sở mà wont đúng như Id là PRIMARY KEY và không thể có giá trị NULL.

3

Chuyển đến thiết kế cho bảng đó. Bây giờ, ở bên phải, đặt cột ID làm cột được đề cập. Nó bây giờ sẽ tự động điền mà không có đặc điểm kỹ thuật.

1

Bạn đã tạo một bảng với ID như PRIMARY KEY, mà đáp ứng UNIQUENOT NULL hạn chế, vì vậy bạn không thể làm cho ID như NULL bằng cách chèn trường tên, vì vậy ID nên cũng được chèn vào.

Thông báo lỗi cho biết điều này.

0

Bạn chỉ cần để xác định các cột mà bạn đang chèn trực tiếp vào:

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

xem có thể kén chọn như thế.

Các vấn đề liên quan