Wymagane jest uprawnienie do przeglądania diagramu bazy danych

10

Niedawno skonfigurowałem SSDT dla naszych programistów. Wymuszamy zmiany w naszych bazach danych deweloperów dokonywane za pośrednictwem SSDT poprzez ograniczenie uprawnień, które każdy programista ma po podłączeniu do serwera (db_datareader, db_datawriter). W ramach SSDT publikujemy nasze zmiany w bazie danych za pomocą skryptu wdrażania, który łączy się przy użyciu logowania z podwyższonymi uprawnieniami.

Moje pytanie. Biorąc pod uwagę, że dołożyliśmy wszelkich starań, aby zablokować bazę danych (aby zatrzymać dryf schematu); czy jest jakiś sposób, aby programiści mogli przeglądać diagramy w tej bazie danych bez konieczności posiadania uprawnień db_owner? Wiem, że każdy programista może tworzyć i przeglądać własne diagramy, ale chcę, aby mogły wyświetlać wszystkie diagramy utworzone przez wielu różnych programistów.

Nie sądzę, żeby to pomogło, ale działamy na serwerze SQL 2012

Każda pomoc będzie bardzo odbierana.

Steve
źródło

Odpowiedzi:

16

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_idod 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 sysdiagramssamej 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:

wprowadź opis zdjęcia tutaj

Teraz dbozbierzemy 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.

Aaron Bertrand
źródło
Bardzo dokładny. myślę, że dam ci ostatnią sugestię. wielkie dzięki
Steve
Dla każdego, kto natknie się na to niedawno, od SSMS 18 (podgląd) diagramy bazy danych są przestarzałą funkcją
LowlyDBA
@ Diagramy bazy danych @LowlyDBA zostały dodane z powrotem do SSMS 18.1
Jeremy Cook
0

Zgodnie z BOL wymagane jest konto z uprawnieniami dbo właściciela bazy danych. Więcej informacji tutaj .

Tak więc użytkownik, który go utworzył, lub członek roli db_owner może otwierać diagramy.

Kin Shah
źródło