Diperlukan izin untuk melihat diagram database

10

Saya baru-baru ini menyiapkan SSDT untuk digunakan pengembang kami. Kami menerapkan perubahan pada database dev kami melalui SSDT dengan membatasi izin yang dimiliki setiap pengembang saat terhubung ke server (db_datareader, db_datawriter). Dalam SSDT kami mempublikasikan perubahan kami ke database menggunakan skrip penerapan yang menghubungkan menggunakan logon dengan izin tinggi.

Pertanyaan saya. Mengingat bahwa kami telah pergi sejauh ini untuk mengunci database (untuk menghentikan penyimpangan skema); apakah ada cara agar pengembang dapat melihat diagram pada database ini tanpa harus memiliki izin db_owner? Saya tahu bahwa setiap pengembang dapat membuat dan melihat diagram mereka sendiri tetapi saya ingin mereka dapat melihat semua diagram, yang telah dibuat oleh banyak pengembang yang berbeda.

Saya tidak berpikir ini akan membantu tetapi kami menjalankan sql server 2012

Bantuan apa pun akan sangat diterima.

Steve
sumber

Jawaban:

16

Dari dokumentasi :

  • Meskipun setiap pengguna dengan akses ke database dapat membuat diagram, setelah diagram dibuat, satu-satunya pengguna yang dapat melihatnya adalah pembuat diagram dan anggota peran db_owner.
  • Kepemilikan diagram hanya dapat ditransfer ke anggota peran db_owner. Ini hanya mungkin jika pemilik diagram sebelumnya telah dihapus dari database.
  • Jika pemilik diagram telah dihapus dari basis data, diagram tersebut akan tetap berada di dalam basis data hingga anggota peran db_owner mencoba membukanya. Pada saat itu anggota db_owner dapat memilih untuk mengambil alih kepemilikan diagram.

Jadi sepertinya Anda tidak akan bisa melakukannya dengan peran yang lebih rendah db_datareader.

Di balik layar, inilah yang disebut Management Studio untuk mendorong daftar:

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

Jadi Anda dapat melihat ini cocok dengan dokumentasi.

Sekarang beberapa ide solusi:

  • Dalam pemicu Logon, memperbarui principal_iddari semua diagram menjadi login saat ini. Ini berarti mereka akan memiliki akses ke semua diagram sampai orang berikutnya masuk. Tidak optimal.
  • Gunakan pemicu di sysdiagramsmeja itu sendiri (itu tidak benar-benar sebuah meja sistem), dan setiap kali diagram dibuat atau diperbarui, menambah / memperbarui salinan untuk setiap principal (dengan nama pengguna mereka ditambahkan). Juga tidak optimal, dan Anda bisa meminta orang lain saling menulis diagram sepanjang hari.

Berikut ini adalah ide dari solusi kedua - yang harus Anda pertahankan di sini adalah daftar kepala basis data yang Anda inginkan untuk dapat mengakses diagram (Anda juga ingin memiliki sesuatu untuk membersihkan diagram yang telah dihapus). , dan juga beberapa perawatan berkala yang menghapus diagram untuk kepala sekolah yang telah dihapus):

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

Setelah membuat beberapa diagram, di sini terlihat seperti apa versi singkat dari Object Explorer untuk pengguna ini:

masukkan deskripsi gambar di sini

Sekarang, dboakan mengumpulkan sejumlah besar salinan diagram, yang mungkin tidak perlu, tetapi Anda mungkin ingin mereka menjadi "master" di sebagian besar keadaan.

Aaron Bertrand
sumber
Sangat teliti. pikir saya akan mencoba saran terakhir Anda. terima kasih banyak
Steve
Bagi siapa pun yang menemukan ini baru-baru ini, pada diagram basis data SSMS 18 (pratinjau) adalah fitur yang sudah usang
LowlyDBA
@LowlyDBA Database Diagram ditambahkan kembali ke SSMS 18.1
Jeremy Cook
0

Sesuai BOL , akun dengan pemilik basis data dbo diperlukan. Info lebih lanjut di sini .

Jadi, pengguna yang membuatnya, atau anggota peran db_owner dapat membuka diagram.

Kin Shah
sumber