Дозвіл, необхідний для перегляду діаграми бази даних


10

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

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

Не думаю, що це допоможе, але ми працюємо на сервері sql 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зберуть цілу купу копій діаграм, що, можливо, не потрібно, але ви, мабуть, хочете, щоб вони були "господарем" у більшості обставин.


Дуже ретельно. думаю, я спробую останню пропозицію. велике спасибі
Стів

Для тих, хто натрапив на це нещодавно,
статі

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

0

Відповідно до BOL , потрібен обліковий запис з правами власника бази даних dbo. Більше інформації тут .

Отже, користувач, який його створив, або член ролі db_owner може відкривати діаграми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.