Требуется разрешение для просмотра схемы базы данных


10

Я недавно настроил SSDT для наших разработчиков. Мы принудительно вносим изменения в наши базы данных dev через SSDT, ограничивая разрешения, которые есть у каждого разработчика при подключении к серверу (db_datareader, db_datawriter). В рамках SSDT мы публикуем наши изменения в базе данных с помощью сценария развертывания, который подключается с помощью входа в систему с повышенными разрешениями.

Мой вопрос. Учитывая, что мы пошли на эту длину, чтобы заблокировать базу данных (чтобы остановить дрейф схемы); Могут ли разработчики просматривать диаграммы в этой базе данных без разрешения db_owner? Я знаю, что каждый разработчик может создавать и просматривать свои собственные диаграммы, но я хочу, чтобы они могли просматривать все диаграммы, которые были созданы многими разными разработчиками.

Я не думаю, что это поможет, но мы запускаем SQL Server 2012

Любая помощь будет в значительной степени получена.

Ответы:


16

Из документации :

  • Хотя любой пользователь, имеющий доступ к базе данных, может создать диаграмму, после ее создания единственными пользователями, которые могут ее видеть, являются создатель диаграммы и любой член роли db_owner.
  • Право собственности на диаграммы может быть передано только членам роли db_owner. Это возможно только в том случае, если предыдущий владелец диаграммы был удален из базы данных.
  • Если владелец диаграммы был удален из базы данных, диаграмма будет оставаться в базе данных до тех пор, пока член роли db_owner не попытается открыть ее. В этот момент член db_owner может принять на себя ответственность за диаграмму.

Таким образом, кажется, что вы не сможете сделать это с более низкими ролями, как db_datareader.

За кулисами вот что вызывает Management Studio для управления списком:

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

Таким образом, вы можете видеть, что это соответствует документации.

Теперь пара обходных идей:

  • В качестве триггера входа в систему, обновить principal_idиз всех диаграмм быть текущий Логин. Это означает, что они будут иметь доступ ко всем диаграммам, пока следующий человек не войдет в систему. Не оптимально.
  • Используйте триггер на самой sysdiagramsтаблице (это на самом деле не системная таблица), и всякий раз, когда диаграмма создается или обновляется, добавляйте / обновляйте копию для каждого участника (с добавлением их имени пользователя). Также не оптимально, и вы могли бы заставить людей переписывать диаграммы друг друга в течение всего дня.

Вот идея второго обходного пути - все, что вам действительно нужно поддерживать, это список участников базы данных, к которым вы хотите иметь доступ к диаграммам (вам также нужно иметь что-то для очистки диаграмм, которые были удалены , а также некоторое периодическое обслуживание, которое удаляет диаграммы для принципалов , которые были удалены):

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

После создания пары диаграмм вот как выглядит сокращенная версия Object Explorer для этих пользователей:

введите описание изображения здесь

Теперь dboсоберем целую кучу копий диаграмм, которые, возможно, не нужны, но вы, вероятно, захотите, чтобы они были «хозяином» в большинстве случаев.


Очень тщательно Думаю, я попробую ваше последнее предложение. Большое спасибо
Стив

Для тех, кто сталкивался с этим недавно, диаграммы базы данных
SSMS

Диаграммы базы данных @LowlyDBA были добавлены обратно в SSMS 18.1
Джереми Кук

0

Согласно BOL , требуется учетная запись с привилегиями dbo владельца базы данных. Больше информации здесь .

Таким образом, пользователь, который его создал, или член роли db_owner могут открывать диаграммы.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.