Dalla documentazione :
- Sebbene qualsiasi utente con accesso a un database possa creare un diagramma, una volta creato il diagramma, gli unici utenti che possono vederlo sono il creatore del diagramma e qualsiasi membro del ruolo db_owner.
- La proprietà dei diagrammi può essere trasferita solo ai membri del ruolo db_owner. Ciò è possibile solo se il precedente proprietario del diagramma è stato rimosso dal database.
- Se il proprietario di un diagramma è stato rimosso dal database, il diagramma rimarrà nel database fino a quando un membro del ruolo db_owner non tenterà di aprirlo. A quel punto il membro db_owner può scegliere di assumere la proprietà del diagramma.
Quindi sembra che non sarai in grado di farlo con ruoli inferiori come db_datareader
.
Dietro le quinte, ecco cosa chiama Management Studio per guidare l'elenco:
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
Quindi puoi vedere che corrisponde alla documentazione.
Ora un paio di idee alternative:
- In un trigger di accesso, aggiornare
principal_id
di tutti diagrammi per l'accesso corrente. Ciò significa che avranno accesso a tutti i diagrammi fino alla prossima persona che effettua l'accesso. Non ottimale.
- Usa un trigger sulla
sysdiagrams
tabella stessa (non è in realtà una tabella di sistema) e ogni volta che un diagramma viene creato o aggiornato, aggiungi / aggiorna una copia per ogni entità (con il nome utente aggiunto). Nemmeno ottimale, e potresti avere persone che si sovrascrivono a vicenda i diagrammi per tutto il giorno.
Ecco un'idea della seconda soluzione: tutto ciò che devi veramente mantenere è un elenco dei principali del database che vuoi poter accedere ai diagrammi (ti consigliamo anche di avere qualcosa per ripulire i diagrammi che sono stati eliminati e anche una manutenzione periodica che elimina i diagrammi per i principali che sono stati eliminati):
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
Dopo aver creato un paio di diagrammi, ecco come appariva una versione ridotta di Object Explorer per questi utenti:
Ora, dbo
raccoglieremo un sacco di copie di diagrammi, il che forse non è necessario, ma probabilmente vuoi che siano il "maestro" nella maggior parte dei casi.