2011-10-18 46 views
7

Theo MSDN, các khung nhìn bao gồm các lựa chọn đơn giản tự động cho phép bạn sử dụng các câu lệnh chèn/cập nhật/xóa trên bảng. Có cách nào để ngăn chặn điều này - để nói với Sql Server rằng khung nhìn là chỉ đọc, và bạn không thể sử dụng nó để sửa đổi bảng?Tạo chế độ xem chỉ đọc trong Sql Server

Trả lời

12

Cách tốt nhất là xóa UPDATE/DELETE/INSERT quyền trên Chế độ xem.

Ngoài ra, bạn có thể tạo kích hoạt INSTEAD OF trên chế độ xem chỉ đơn giản là không có gì để cập nhật không thành công hoặc có quite a few constructs that make views non updatable. Vì vậy, bạn có thể chọn một trong đó không thay đổi ngữ nghĩa hoặc hiệu quả và sau đó vi phạm nó.

Chỉnh sửa: Phần bên dưới dường như phù hợp với hóa đơn.

CREATE VIEW Bar 
AS 
SELECT TOP 100 PERCENT x 
FROM foo 
WITH CHECK OPTION 
+0

Quyền +1 sẽ ngăn không cho mã này không được mã. Nhưng nếu dân gian có thể viết thông qua xem thì tôi nghi ngờ có quyền trên các bảng cơ sở quá ... – gbn

+0

Cảm ơn, hoạt động như một say mê. Các chế độ xem đó thực sự sẽ đề cập đến một cơ sở dữ liệu khác mà người dùng sẽ không có quyền truy cập. Tôi muốn làm cho họ chỉ đọc để người dùng sẽ không thể sửa đổi cơ sở dữ liệu mà anh ta không có quyền truy cập thông qua các khung nhìn trong cơ sở dữ liệu mà anh ta có quyền truy cập. Tôi muốn sử dụng quyền cho mỗi cơ sở dữ liệu thay vì quyền đối với mỗi đối tượng để giữ cho mọi thứ đơn giản và chắc chắn hơn rằng tôi không bỏ lỡ vi phạm trong định nghĩa quyền. –

+3

Tôi sẽ chỉ ra một mối nguy hiểm với mã được nối vào cuối. Nó dường như xoay quanh 'WITH CHECK OPTION'. Nếu bạn quay lại và chỉnh sửa chế độ xem với SQL Server Management Studio, nó sẽ không bao gồm 'WITH CHECK OPTION' và khung nhìn sẽ được đọc/ghi lại. – BIBD

7

Bạn có thể chỉ định một nhà điều hành UNION để làm cho SQL Server thất bại trong INSERT/UPDATE/DELETE hoạt động, như thế này:

create view SampleView 
as 
    select ID, value from table 
    union all 
    select 0, '0' where 1=0 

Truy vấn cuối cùng không trả lại bất kỳ hàng ở tất cả, nhưng phải có cùng số lượng trường có cùng loại dữ liệu với truy vấn đầu tiên, để sử dụng an toàn UNION. Xem liên kết này để biết thêm thông tin: Different ways to make a table read only in a SQL Server database

+0

Bạn cũng có thể thêm bảng "UNION SELECT TOP 0 * FROM" (ít nhất là trong SQLServer 2014). – Christoph

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