Cần có quyền để xem sơ đồ cơ sở dữ liệu


10

Gần đây tôi đã thiết lập SSDT cho các nhà phát triển của chúng tôi sử dụng. Chúng tôi thực thi các thay đổi đối với cơ sở dữ liệu dev của mình được thực hiện thông qua SSDT bằng cách giới hạn các quyền mà mỗi nhà phát triển có khi kết nối với máy chủ (db_datareader, db_datawriter). Trong SSDT, chúng tôi xuất bản các thay đổi của chúng tôi đến cơ sở dữ liệu bằng cách sử dụng tập lệnh triển khai kết nối bằng cách sử dụng nhật ký với quyền nâng cao.

Câu hỏi của tôi. Cho rằng chúng ta đã đi đến độ dài này để khóa cơ sở dữ liệu (để dừng trôi lược đồ); Có cách nào để các nhà phát triển có thể xem sơ đồ trên cơ sở dữ liệu này mà không cần phải có quyền db_owner không? Tôi biết rằng mỗi nhà phát triển có thể tạo và xem sơ đồ của riêng mình nhưng tôi muốn họ có thể xem tất cả các sơ đồ đã được tạo bởi nhiều nhà phát triển khác nhau.

Tôi không nghĩ rằng điều này sẽ giúp nhưng chúng tôi đang chạy máy chủ sql 2012

Bất kỳ trợ giúp sẽ được nhận rất nhiều.

Câu trả lời:


16

Từ tài liệu :

  • Mặc dù bất kỳ người dùng nào có quyền truy cập vào cơ sở dữ liệu đều có thể tạo sơ đồ, nhưng khi sơ đồ đã được tạo, người dùng duy nhất có thể thấy nó là người tạo sơ đồ và bất kỳ thành viên nào của vai trò db_owner.
  • Quyền sở hữu các sơ đồ chỉ có thể được chuyển cho các thành viên của vai trò db_owner. Điều này chỉ có thể nếu chủ sở hữu trước của sơ đồ đã bị xóa khỏi cơ sở dữ liệu.
  • Nếu chủ sở hữu của sơ đồ đã bị xóa khỏi cơ sở dữ liệu, sơ đồ sẽ vẫn còn trong cơ sở dữ liệu cho đến khi một thành viên của vai trò db_owner cố gắng mở nó. Tại thời điểm đó, thành viên db_owner có thể chọn tiếp quản quyền sở hữu sơ đồ.

Vì vậy, có vẻ như bạn sẽ không thể làm điều đó với các vai trò thấp hơn như db_datareader.

Đằng sau hậu trường, đây là những gì Management Studio đang kêu gọi để điều khiển danh sách:

CREATE PROCEDURE dbo.sp_helpdiagrams
(
    @diagramname sysname = NULL,
    @owner_id int = NULL
)
WITH EXECUTE AS N'dbo'
AS
BEGIN
    DECLARE @user sysname
    DECLARE @dboLogin bit
    EXECUTE AS CALLER;
        SET @user = USER_NAME();
        SET @dboLogin = CONVERT(bit,IS_MEMBER('db_owner'));
    REVERT;
    SELECT
        [Database] = DB_NAME(),
        [Name] = name,
        [ID] = diagram_id,
        [Owner] = USER_NAME(principal_id),
        [OwnerID] = principal_id
    FROM
        sysdiagrams
    WHERE
        (@dboLogin = 1 OR USER_NAME(principal_id) = @user) AND
        (@diagramname IS NULL OR name = @diagramname) AND
        (@owner_id IS NULL OR principal_id = @owner_id)
    ORDER BY
        4, 5, 1
END

Vì vậy, bạn có thể thấy điều này phù hợp với các tài liệu.

Bây giờ một vài ý tưởng giải pháp:

  • Trong một cò Logon, cập nhật principal_idcủa tất cả các sơ đồ là đăng nhập hiện tại. Điều này có nghĩa là họ sẽ có quyền truy cập vào tất cả các sơ đồ cho đến khi người tiếp theo đăng nhập. Không tối ưu.
  • Sử dụng một kích hoạt trên sysdiagramschính bảng (nó không thực sự là một bảng hệ thống) và bất cứ khi nào một sơ đồ được tạo hoặc cập nhật, hãy thêm / cập nhật một bản sao cho mỗi hiệu trưởng (có thêm tên người dùng của chúng). Không tối ưu, và bạn có thể yêu cầu mọi người ghi đè lên sơ đồ của nhau suốt cả ngày.

Đây là ý tưởng của cách giải quyết thứ hai - tất cả những gì bạn thực sự phải duy trì ở đây là danh sách các nguyên tắc cơ sở dữ liệu mà bạn muốn có thể truy cập vào sơ đồ (bạn cũng sẽ muốn có một cái gì đó để xóa sơ đồ đã bị xóa và cũng có một số bảo trì định kỳ xóa sơ đồ cho các hiệu trưởng đã bị xóa):

CREATE TRIGGER dbo.sysdiagrams_distribute
ON dbo.sysdiagrams
WITH EXECUTE AS N'dbo'
FOR INSERT, UPDATE
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @p TABLE(principal_id INT, name SYSNAME);

  INSERT @p SELECT principal_id, name
    FROM sys.database_principals
    -- change this list:
    WHERE name IN (N'test_blat_user', N'test_blat_user2', N'dbo');

  UPDATE d 
    SET [version] = i.version, definition = i.definition
  FROM inserted AS i
  CROSS JOIN @p AS p
  INNER JOIN dbo.sysdiagrams AS d
  ON d.name = i.name
  AND d.principal_id = p.principal_id;

  INSERT dbo.sysdiagrams(name, principal_id, version, definition)
    SELECT i.name, p.principal_id, i.version, i.definition
    FROM inserted AS i
    CROSS JOIN @p AS p
    WHERE NOT EXISTS 
    (
      SELECT 1 FROM dbo.sysdiagrams WHERE name = i.name
      AND principal_id = p.principal_id
    );
END
GO

Sau khi tạo một vài sơ đồ, đây là phiên bản rút gọn của Object Explorer cho những người dùng này:

nhập mô tả hình ảnh ở đây

Bây giờ, dbosẽ thu thập một loạt các bản đồ, có thể không cần thiết, nhưng bạn có thể muốn chúng là "bản gốc" trong hầu hết các trường hợp.


Rất kỹ lưỡng. nghĩ rằng tôi sẽ đưa ra đề nghị cuối cùng của bạn một thử. cảm ơn rất nhiều
Steve

Đối với bất kỳ ai đi qua điều này gần đây, kể từ sơ đồ cơ sở dữ liệu SSMS 18 (bản xem trước) là một tính năng không dùng nữa
LowlyDBA

Sơ đồ cơ sở dữ liệu @LowlyDBA đã được thêm lại vào SSMS 18.1
Jeremy Cook

0

Theo BOL , một tài khoản có đặc quyền dbo của chủ sở hữu cơ sở dữ liệu là bắt buộc. Thêm thông tin ở đây .

Vì vậy, người dùng đã tạo ra nó hoặc một thành viên của vai trò db_owner có thể mở sơ đồ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.