2017-08-04 13 views
9

Tôi đang cố gắng đặt cơ sở dữ liệu ở chế độ chỉ đọc bằng lệnh sau và nó hoạt động.Cơ sở dữ liệu chỉ đọc nhưng chỉ có một vài bảng có thể ghi

ALTER DATABASE [TESTDB] SET READ_ONLY WITH NO_WAIT 

Tuy nhiên, tôi chỉ cần cho phép một vài bảng như UserSession, v.v ... có thể ghi được. Có thể không?

Chúng tôi có khoảng 500 bảng trong cơ sở dữ liệu và chúng tôi chỉ cần cho phép 4 bảng có thể ghi được.

+2

có thể trùng lặp của https://stackoverflow.com/questions/2529839/how-to-make-a-table-read-only-in-sql-server – MatSnow

+0

@MatSnow chúng tôi có khoảng 500 + bảng trong cơ sở dữ liệu và chúng tôi cần chỉ cho phép 4 bảng có thể ghi được. Tôi có nên thêm 496 chỉ đọc thay vì làm cho toàn bộ cơ sở dữ liệu như chỉ đọc và cho phép chỉ có 4 ghi? – Developer

+2

AFAIK không có cách nào để chỉ đặt vài bảng để có thể ghi nếu bạn đặt cơ sở dữ liệu chỉ đọc. Tôi sẽ đề nghị bạn đặt quyền phù hợp với nhu cầu của bạn. – MatSnow

Trả lời

5

Bạn có thể từ chối INSERT, UPDATE, DELETE-public vai trò như:

DENY UPDATE ON tab1 TO public 
DENY INSERT ON tab1 TO public 
DENY DELETE ON tab1 TO public 

Sau đó, người sử dụng thường xuyên (không quản trị hệ thống) sẽ nhận được một lỗi khi cố gắng để chèn vào tab1:

INSERT INTO tab1 (id) VALUES (1) 

--Msg 229, Level 14, State 5, Line 20 
--The INSERT permission was denied on the object 'tab1', database 'test', schema 'dbo'. 

Nếu đây là thứ bạn cảm thấy thoải mái khi thêm vào cơ sở dữ liệu, bạn có thể tạo tập lệnh để thay đổi tất cả các bảng như:

EXEC sp_msforeachtable ' 
PRINT '' 
    DENY UPDATE ON ? TO public 
    DENY INSERT ON ? TO public 
    DENY DELETE ON ? TO public 
'' 
' 

Đảm bảo bạn không từ chối ghi vào 4 bảng đó mà vẫn cần được ghi vào.

Không chắc chắn về ứng dụng của bạn, nhưng nếu bạn không muốn từ chối quyền trên vai trò public, bạn có thể xem xét việc tạo vai trò của riêng mình, từ chối quyền truy cập trên vai trò đó và thay vào đó làm cho người dùng tham gia vai trò đó.

Hy vọng điều đó có ý nghĩa.

+0

Điều gì sẽ xảy ra nếu ai đó sử dụng lệnh DDL (TRUNCATE/ALTER/DROP)? – lad2025

+0

Người dùng thông thường thường không có các quyền này. Tuy nhiên, nếu bạn có thể hạn chế điều này bằng nhiều quyền DENY hơn, hoặc bạn có thể sử dụng trình kích hoạt cơ sở dữ liệu nếu có tùy chọn thay đổi lược đồ cơ sở dữ liệu (ví dụ: không phải là cơ sở dữ liệu bên thứ 3 mà bạn không thể thay đổi) – Horia

+0

bạn không thể từ chối quyền đối tượng chủ sở hữu cộng với bạn phải nhớ để làm điều đó cho tất cả người dùng mới .. Thực sự chỉ đọc là ở cấp độ DB hoặc nhóm tệp.' – lad2025

1

Bạn có thể sử dụng một cái gì đó như thế này:

ALTER TABLE [schemaName].[tableName] READ ONLY ON|OFF 
+0

Tôi nghĩ rằng đó là cụ thể cho Oracle (11g), trong khi câu hỏi liên quan đến MSSQL. – Horia

0

Bạn có thể tạo giản đồ mới trên cơ sở dữ liệu của bạn, ví dụ upd Bây giờ bạn có thể cho đọc & quyền write cho rằng giản đồ cho người dùng cụ thể mà cần phải có khả năng sửa đổi dữ liệu. Sau đó, bạn có thể tạo các khung nhìn có thể cập nhật/insertable dựa trên bàn mà bạn muốn được cập nhật

create view upd.Tab1 
as 
select * from dbo.Tab1 
GO 

Chỉ đối tượng trong schema upd sẽ ghi cho người dùng với quyền upd schema.

5

Đề xuất của tôi là lưu trữ hai loại bảng trong các lược đồ khác nhau - giả sử readablewritable.

Khi SQL Server giới thiệu lược đồ vào năm 2005, các idea là schemas là một đơn vị đối với an ninh và cơ sở dữ liệu là một đơn vị để sao lưu và phục hồi:

Microsoft SQL Server 2005 giới thiệu các khái niệm về đối tượng cơ sở dữ liệu schemas . Các lược đồ tương tự với các không gian tên hoặc vùng chứa riêng biệt được sử dụng để lưu trữ các đối tượng cơ sở dữ liệu. Các quyền bảo mật áp dụng cho các lược đồ, biến chúng thành công cụ quan trọng để tách và bảo vệ cơ sở dữ liệu các đối tượng dựa trên các quyền truy cập.

Điều này sẽ làm cho hai lược đồ khác nhau trở thành ứng cử viên mạnh mẽ cho kiến ​​trúc dữ liệu của bạn.

Nói cách khác, đặt lược đồ readable thành read_only. Và đặt các bảng khác trong lược đồ writable.

+0

Điều này hoạt động trong một số trường hợp. Nhưng dữ liệu thực tế trong cơ sở dữ liệu không bao giờ được đọc chỉ. Người dùng có đủ quyền vẫn có thể thay đổi dữ liệu trong lược đồ 'có thể đọc'. Ví dụ, sysAdmin sẽ có thể thay đổi trực tiếp dữ liệu. –

+0

@ChamikaGoonetilaka. . . Tất nhiên, bạn có thể điều chỉnh các quyền để được bất cứ điều gì ứng dụng cần. Và "có thể đọc được" và "có thể ghi" có thể không phải là tên tốt nhất. –

+1

@ChamikaGoonetilaka đối số của bạn là thiếu sót. Quản trị viên hệ thống luôn có khả năng cho phép cơ sở dữ liệu có thể ghi được. bạn có thể dừng lại, bảo mật là một kế hoạch không tuyệt đối. – Namphibian

3

Bạn có thể lưu trữ điều này bằng cách di chuyển các bảng có thể ghi vào một nhóm tệp riêng biệt và làm cho nhóm tệp khác chỉ đọc.

Bước Một - Tạo một filegroup khác nhau

ALTER DATABASE TESTDB ADD FILEGROUP Writable_FG; 

Bước Hai - Thêm một tệp dữ liệu để The New filegroup

ALTER DATABASE TESTDB ADD FILE (
    NAME = JeanAnn2, 
    FILENAME = 'D:\MSSQL\TESTDB_Writable_FG_01.ndf', 
    SIZE = 6MB, 
    MAXSIZE = 18MB, 
    FILEGROWTH = 1 
) TO FILEGROUP Writable_FG; 

Bước Ba - Di chuyển các bảng mà bạn cần có thể ghi được, vào nhóm tập tin mới

Đối với điều này, bạn cần tạo lại chỉ mục nhóm của bảng trên nhóm tệp mới.

CREATE CLUSTERED INDEX CIX_YourTable 
ON dbo.YourTable(YourClusteringKeyFields) 
WITH DROP_EXISTING 
ON [Writable_FG] 

hoặc nếu chỉ số nhóm của bạn là độc đáo:

CREATE UNIQUE CLUSTERED INDEX CIX_YourTable 
ON dbo.YourTable(YourClusteringKeyFields) 
WITH DROP_EXISTING 
ON [Writable_FG] 

Làm điều này cho tất cả bốn bảng mà bạn cần phải ghi.

Bước Bốn - Tận dụng tối filegroup khác readonly

ALTER DATABASE TESTDB MODIFY FILEGROUP [PRIMARY] READ_ONLY; 

Ở đây, người ta cho rằng các filegroup khác là chính.

0

Bạn có thể đặt 4 bảng trên cơ sở dữ liệu differnt và cơ sở dữ liệu của bạn đặt từ đồng nghĩa vào cơ sở dữ liệu với 4 bảng bạn muốn cập nhật.

CREATE SYNONYM sessionTables 
SELECT * 
FROM WriteableDatabase.dbo.sessionTables 
Các vấn đề liên quan