Bir veritabanı diyagramını görüntülemek için izin gerekir


10

Kısa bir süre önce geliştiricilerimizin kullanması için SSDT kurdum. Geliştirme veritabanlarımızdaki değişikliklerin, her geliştiricinin sunucuya bağlandığında sahip olduğu izinleri sınırlayarak SSDT aracılığıyla yapılmasını zorunlu kılıyoruz (db_datareader, db_datawriter). SSDT içinde değişikliklerimizi, yükseltilmiş izinlerle oturum açarak bağlanan bir dağıtım komut dosyası kullanarak yayınlarız.

Benim sorum. Veritabanını kilitlemek (şema sapmasını durdurmak için) için bu uzunluğa gittik; geliştiriciler db_owner izni olması gerekmeden bu veritabanı diyagramları görüntülemek için herhangi bir yolu var mı? Her geliştiricinin kendi diyagramlarını oluşturup görüntüleyebileceğini biliyorum, ancak birçok farklı geliştirici tarafından oluşturulan tüm diyagramları görüntülemelerini istiyorum.

Bunun yardımcı olacağını düşünmüyorum ama sql server 2012 çalıştırıyoruz

Herhangi bir yardım büyük ölçüde alınacaktır.

Yanıtlar:


16

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_idait tüm mevcut giriş olmak diyagramları. Bu, bir sonraki kişi oturum açana kadar tüm diyagramlara erişebilecekleri anlamına gelir.
  • sysdiagramsTablonun 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:

resim açıklamasını buraya girin

Şimdi, dbodiyagramları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.


Çok titiz. Sanırım son öneriyi deneyeceğim. çok teşekkürler
Steve

Son zamanlarda SSMS 18 (önizleme) veritabanı şemaları
itiraz

@LowlyDBA Veritabanı Diyagramları SSMS
Jeremy Cook

0

BOL uyarınca , veritabanı sahibi dbo ayrıcalıklarına sahip bir hesap gereklidir. Daha fazla bilgi burada .

Böylece, onu oluşturan kullanıcı veya db_owner rolünün bir üyesi diyagramları açabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.