데이터베이스 다이어그램을 보는 데 필요한 권한


10

최근에 개발자들이 사용할 SSDT를 설정했습니다. 서버에 연결할 때 각 개발자의 권한 (db_datareader, db_datawriter)을 제한하여 SSDT를 통해 개발 데이터베이스를 변경합니다. SSDT 내에서 관리자 권한으로 로그온하여 연결하는 배포 스크립트를 사용하여 변경 사항을 데이터베이스에 게시합니다.

내 질문. 데이터베이스를 잠그기 위해 (스키마 드리프트를 중지하기 위해)이 길이로 갔다고 가정하면; 개발자가 db_owner 권한이 없어도이 데이터베이스에서 다이어그램을 볼 수있는 방법이 있습니까? 각 개발자가 자신의 다이어그램을 작성하고 볼 수는 있지만 많은 개발자가 작성한 모든 다이어그램을 볼 수 있기를 바랍니다.

이것이 도움이되지는 않지만 SQL Server 2012를 실행 중입니다.

어떤 도움도 크게받을 것입니다.

답변:


16

에서 문서 :

  • 데이터베이스에 액세스 할 수있는 모든 사용자가 다이어그램을 작성할 수 있지만 다이어그램이 작성된 후에는이를 볼 수있는 유일한 사용자는 다이어그램의 작성자와 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필요하지 않을 수도있는 다이어그램의 전체 사본을 수집하지만 대부분의 경우 "마스터"가되기를 원할 것입니다.


매우 철저합니다. 마지막 제안을해볼 것 같아요. 고마워
Steve

사람이 SSMS의로, 최근이 가로 질러 오는 18 (미리보기) 데이터베이스 다이어그램이 있습니다 사용되지 않는 기능
LowlyDBA

@LowlyDBA 데이터베이스 다이어그램이 SSMS 18.1
Jeremy Cook

0

BOL에 따라 데이터베이스 소유자 dbo 권한이있는 계정이 필요합니다. 자세한 내용은 여기를 참조하십시오 .

따라서이를 작성한 사용자 또는 db_owner 역할의 구성원이 다이어그램을 열 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.