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