Aus der Dokumentation :
- Obwohl jeder Benutzer mit Zugriff auf eine Datenbank ein Diagramm erstellen kann, können nach dem Erstellen des Diagramms nur der Ersteller des Diagramms und ein Mitglied der Rolle db_owner das Diagramm sehen.
- Das Eigentum an Diagrammen kann nur auf Mitglieder der Rolle db_owner übertragen werden. Dies ist nur möglich, wenn der Vorbesitzer des Diagramms aus der Datenbank entfernt wurde.
- Wenn der Eigentümer eines Diagramms aus der Datenbank entfernt wurde, bleibt das Diagramm in der Datenbank, bis ein Mitglied der Rolle db_owner versucht, es zu öffnen. Zu diesem Zeitpunkt kann das Mitglied db_owner die Übernahme des Diagramms übernehmen.
Es scheint also, dass Sie es mit niedrigeren Rollen wie nicht schaffen werden db_datareader
.
Hinter den Kulissen ruft Management Studio Folgendes auf, um die Liste zu erstellen:
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
Sie können also sehen, dass dies mit der Dokumentation übereinstimmt.
Nun ein paar Workaround-Ideen:
- In einem Logon - Trigger aktualisiert die
principal_id
von allen Diagrammen die aktuelle Login zu sein. Dies bedeutet, dass sie Zugriff auf alle Diagramme haben, bis sich die nächste Person anmeldet. Nicht optimal.
- Verwenden Sie einen Trigger für die
sysdiagrams
Tabelle selbst (es handelt sich nicht wirklich um eine Systemtabelle). Fügen Sie bei jedem Erstellen oder Aktualisieren eines Diagramms eine Kopie für jeden Principal hinzu / aktualisieren Sie sie (mit angehängtem Benutzernamen). Auch nicht optimal, und Sie könnten den ganzen Tag über Leute haben, die sich gegenseitig die Diagramme überschreiben.
Hier ist eine Idee der zweiten Problemumgehung - alles, was Sie hier wirklich pflegen müssen, ist eine Liste der Datenbankprinzipien, auf die Sie zugreifen möchten, um auf die Diagramme zugreifen zu können (Sie möchten auch etwas zum Bereinigen von gelöschten Diagrammen haben und auch einige regelmäßige Wartungsarbeiten, bei denen Diagramme für gelöschte Principals gelöscht werden):
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
Nach dem Erstellen einiger Diagramme sah eine gekürzte Version von Object Explorer für diese Benutzer folgendermaßen aus:
dbo
Sammeln Sie jetzt eine ganze Reihe von Kopien von Diagrammen, was möglicherweise nicht erforderlich ist, aber Sie möchten wahrscheinlich, dass diese in den meisten Fällen der "Meister" sind.