Gönderen belgeler :
- Bir veritabanına erişimi olan herhangi bir kullanıcı bir diyagram oluşturabilir, ancak diyagram oluşturulduktan sonra, onu görebilen tek kullanıcı diyagramın yaratıcısı ve db_owner rolünün herhangi bir üyesidir.
- Diyagramların sahipliği yalnızca db_owner rolünün üyelerine aktarılabilir. Bu, yalnızca diyagramın önceki sahibi veritabanından kaldırılmışsa mümkündür.
- Bir diyagramın sahibi veritabanından kaldırılmışsa, diyagram, db_owner rolünün bir üyesi onu açmaya çalışana kadar veritabanında kalır. Bu noktada, db_owner üyesi diyagramın sahipliğini devralmayı seçebilir.
Görünüşe göre bunu daha düşük rollerle yapamayacaksınız db_datareader
.
Perde arkasında, Management Studio'nun listeyi yürütmek için çağırdığı şey:
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
Böylece bunun belgelere uygun olduğunu görebilirsiniz.
Şimdi birkaç geçici çözüm fikri:
- Bir Oturum açma tetikleyici, güncellenecek
principal_id
ait tüm mevcut giriş olmak diyagramları. Bu, bir sonraki kişi oturum açana kadar tüm diyagramlara erişebilecekleri anlamına gelir.
sysdiagrams
Tablonun kendisinde bir tetikleyici kullanın ( gerçekten bir sistem tablosu değildir) ve bir diyagram oluşturulduğunda veya güncellendiğinde, her ana öğe için (kullanıcı adı eklenmiş olarak) bir kopya ekleyin / güncelleyin. Optimal de değil ve gün boyu birbirinizin diyagramlarının üzerine yazı yazabilirsiniz.
İşte ikinci geçici çözüm hakkında bir fikir - burada sürdürmeniz gereken tek şey, şemalara erişmek istediğiniz veritabanı ilkelerinin bir listesidir (ayrıca silinen şemaları temizlemek için bir şeye sahip olmak istersiniz) ve ayrıca silinen yöneticiler için diyagramları silen bazı periyodik bakımlar ):
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
Birkaç diyagram oluşturduktan sonra, bu kullanıcılar için Nesne Gezgini'nin kısaltılmış bir sürümü şöyle görünüyordu:
Şimdi, dbo
diyagramların bir sürü kopyasını toplayacaktır, ki bu belki gerekli değildir, ancak muhtemelen çoğu durumda bunların "usta" olmasını istersiniz.