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_id
dari semua diagram menjadi login saat ini. Ini berarti mereka akan memiliki akses ke semua diagram sampai orang berikutnya masuk. Tidak optimal.
- Gunakan pemicu di
sysdiagrams
meja 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:
Sekarang, dbo
akan mengumpulkan sejumlah besar salinan diagram, yang mungkin tidak perlu, tetapi Anda mungkin ingin mereka menjadi "master" di sebagian besar keadaan.