Autorizzazione richiesta per visualizzare un diagramma del database


10

Di recente ho impostato SSDT per i nostri sviluppatori da utilizzare. Imponiamo che le modifiche ai nostri database di sviluppo vengano eseguite tramite SSDT limitando le autorizzazioni di cui dispongono gli sviluppatori quando sono connessi al server (db_datareader, db_datawriter). All'interno di SSDT pubblichiamo le nostre modifiche al database utilizzando uno script di distribuzione che si connette utilizzando un accesso con autorizzazioni elevate.

La mia domanda. Dato che siamo andati a questa lunghezza per bloccare il database (per fermare la deriva dello schema); c'è un modo in cui gli sviluppatori possono visualizzare i diagrammi su questo database senza avere il permesso db_owner? So che ogni sviluppatore può creare e visualizzare i propri diagrammi, ma voglio che siano in grado di visualizzare tutti i diagrammi, che sono stati creati da molti sviluppatori diversi.

Non credo che questo aiuterà, ma stiamo eseguendo SQL Server 2012

Qualsiasi aiuto sarà molto apprezzato.

Risposte:


16

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_iddi 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 sysdiagramstabella 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:

inserisci qui la descrizione dell'immagine

Ora, dboraccoglieremo un sacco di copie di diagrammi, il che forse non è necessario, ma probabilmente vuoi che siano il "maestro" nella maggior parte dei casi.


Molto approfondito. penso che proverò il tuo ultimo suggerimento. grazie mille
Steve

Per chiunque si imbattesse di recente in questo, a partire dai diagrammi del database SSMS 18 (anteprima) sono una funzionalità obsoleta
LowlyDBA

I diagrammi del database @LowlyDBA sono stati aggiunti nuovamente in SSMS 18.1
Jeremy Cook,

0

Come da BOL , è richiesto un account con privilegi di dbo del proprietario del database. Maggiori informazioni qui .

Pertanto, l'utente che lo ha creato o un membro del ruolo db_owner può aprire i diagrammi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.