Из документации :
- Хотя любой пользователь, имеющий доступ к базе данных, может создать диаграмму, после ее создания единственными пользователями, которые могут ее видеть, являются создатель диаграммы и любой член роли 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
соберем целую кучу копий диаграмм, которые, возможно, не нужны, но вы, вероятно, захотите, чтобы они были «хозяином» в большинстве случаев.