Z dokumentacji :
- Chociaż każdy użytkownik mający dostęp do bazy danych może utworzyć diagram, po utworzeniu diagramu jedynymi użytkownikami, którzy go widzą, jest twórca diagramu i każdy członek roli db_owner.
- Własność diagramów można przenieść tylko na członków roli db_owner. Jest to możliwe tylko wtedy, gdy poprzedni właściciel diagramu został usunięty z bazy danych.
- Jeśli właściciel diagramu został usunięty z bazy danych, diagram pozostanie w bazie danych, dopóki członek roli db_owner nie spróbuje go otworzyć. W tym momencie członek db_owner może przejąć własność diagramu.
Wygląda więc na to, że nie będziesz w stanie tego zrobić z niższymi rolami db_datareader
.
Za kulisami oto, co wzywa Management Studio do kierowania listą:
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
Możesz więc zobaczyć, że pasuje to do dokumentacji.
Teraz kilka pomysłów na obejście:
- W wyzwalacz logowania, zaktualizuj
principal_id
od wszystkich schematów być obecny logowania. Oznacza to, że będą mieli dostęp do wszystkich diagramów, dopóki następna osoba się nie zaloguje. Nie optymalne.
- Użyj wyzwalacza na
sysdiagrams
samej tabeli (tak naprawdę nie jest to tabela systemowa), a za każdym razem, gdy diagram jest tworzony lub aktualizowany, dodawaj / aktualizuj kopię dla każdej jednostki głównej (z dołączoną nazwą użytkownika). Nie jest to również optymalne, a ludzie mogą przez cały dzień nadpisywać sobie nawzajem diagramy.
Oto pomysł drugiego obejścia - wszystko, co naprawdę musisz tutaj utrzymywać, to lista podmiotów baz danych, do których chcesz mieć dostęp do diagramów (będziesz też chciał mieć coś do czyszczenia diagramów, które zostały usunięte , a także niektóre okresowe czynności konserwacyjne, które usuwają diagramy usuniętych zleceniodawców ):
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
Po utworzeniu kilku diagramów, oto jak wyglądała skrócona wersja Object Explorer dla tych użytkowników:
Teraz dbo
zbierzemy całą masę kopii diagramów, co może nie jest konieczne, ale prawdopodobnie chcesz, aby były one „mistrzem” w większości przypadków.