Lấy cảm hứng từ nhiều câu hỏi liên quan schema Tôi đã nhìn thấy ...Máy chủ SQL: Cách cho phép lược đồ?
Ownership chaining cho phép tôi GRANT EXECUTE trên một thủ tục lưu trữ mà không cần quyền rõ ràng trên bảng tôi sử dụng, nếu cả hai thủ tục lưu trữ và bàn là trong lược đồ tương tự.
Nếu chúng tôi sử dụng các lược đồ riêng biệt thì tôi phải rõ ràng CẤP XXX trên các bảng lược đồ khác nhau. Ví dụ về chuỗi quyền sở hữu thể hiện điều đó. Điều này có nghĩa là người dùng thực thi proc được lưu trữ có thể đọc/ghi trực tiếp các bảng của bạn.
Điều này sẽ giống như có quyền truy cập trực tiếp vào các biến cá thể của bạn trong một lớp, bỏ qua getter/setters, phá vỡ đóng gói.
Chúng tôi cũng sử dụng bảo mật cấp hàng để hạn chế những gì ai đó nhìn thấy và chúng tôi áp dụng điều này trong các thủ tục được lưu trữ.
Vì vậy, làm cách nào chúng tôi có thể duy trì việc tách giản đồ và ngăn truy cập bảng trực tiếp?
Tất nhiên, câu hỏi sẽ không áp dụng nếu bạn sử dụng ORM hoặc không sử dụng procs được lưu trữ. Nhưng tôi không hỏi nếu tôi nên sử dụng một ORM hay proc được lưu trữ trong trường hợp bất cứ ai cảm thấy cần phải soi sáng cho tôi ...
Chỉnh sửa, ví dụ
CREATE USER OwnsMultiSchema WITHOUT LOGIN
GO
CREATE SCHEMA MultiSchema1 AUTHORIZATION OwnsMultiSchema
GO
CREATE SCHEMA MultiSchema2 AUTHORIZATION OwnsMultiSchema
GO
CREATE USER OwnsOtherSchema WITHOUT LOGIN
GO
CREATE SCHEMA OtherSchema AUTHORIZATION OwnsOtherSchema
GO
CREATE TABLE MultiSchema1.T1 (foo int)
GO
CREATE TABLE MultiSchema2.T2 (foo int)
GO
CREATE TABLE OtherSchema.TA (foo int)
GO
CREATE PROC MultiSchema1.P1
AS
SELECT * FROM MultiSchema1.T1
SELECT * FROM MultiSchema2.T2
SELECT * FROM OtherSchema.TA
Go
EXEC AS USER = 'OwnsMultiSchema'
GO
--gives error on OtherSchema
EXEC MultiSchema1.P1
GO
REVERT
GO
CREATE PROC OtherSchema.PA
AS
SELECT * FROM MultiSchema1.T1
SELECT * FROM MultiSchema2.T2
SELECT * FROM OtherSchema.TA
Go
GRANT EXEC ON OtherSchema.PA TO OwnsMultiSchema
GO
EXEC AS USER = 'OwnsMultiSchema'
GO
--works
EXEC OtherSchema.PA
GO
REVERT
GO
Chỉnh sửa 2:
- Chúng tôi không sử dụng "chuỗi quyền sở hữu cơ sở dữ liệu chéo"
- Bảo mật cấp hàng là cá trích đỏ và không có liên quan: chúng tôi không sử dụng nó ở mọi nơi
Có thể cung cấp ví dụ được mã hóa của kịch bản lược đồ riêng biệt mà bạn mô tả để làm rõ không? Trong kịch bản của bạn, làm hai lược đồ riêng biệt có cùng một chủ sở hữu? –
Tại sao bỏ phiếu đóng cho serverfault? Nó dành cho khỉ mã, không phải là hệ thống quản trị ... – gbn
@ John Sansom: vâng tôi sẽ làm. – gbn