AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 43946
Accepted
Steve
Steve
Asked: 2013-06-07 01:44:27 +0800 CST2013-06-07 01:44:27 +0800 CST 2013-06-07 01:44:27 +0800 CST

Permissão necessária para visualizar um diagrama de banco de dados

  • 772

Recentemente, configurei o SSDT para nossos desenvolvedores usarem. Reforçamos que as alterações em nossos bancos de dados dev sejam feitas por meio de SSDT, limitando as permissões que cada desenvolvedor tem quando conectado ao servidor (db_datareader, db_datawriter). No SSDT, publicamos nossas alterações no banco de dados usando um script de implantação que se conecta usando um logon com permissões elevadas.

Minha pergunta. Dado que chegamos a esse ponto para bloquear o banco de dados (para interromper o desvio do esquema); existe alguma maneira que os desenvolvedores possam visualizar os diagramas neste banco de dados sem ter que ter a permissão db_owner? Eu sei que cada desenvolvedor pode criar e visualizar seus próprios diagramas, mas eu quero que eles possam visualizar todos os diagramas, que foram criados por muitos desenvolvedores diferentes.

Eu não acho que isso vai ajudar, mas estamos executando o sql server 2012

Qualquer ajuda será muito bem recebida.

sql-server sql-server-2012
  • 2 2 respostas
  • 33268 Views

2 respostas

  • Voted
  1. Best Answer
    Aaron Bertrand
    2013-06-07T05:30:15+08:002013-06-07T05:30:15+08:00

    Da documentação :

    • Embora qualquer usuário com acesso a um banco de dados possa criar um diagrama, após a criação do diagrama, os únicos usuários que podem vê-lo são o criador do diagrama e qualquer membro da função db_owner.
    • A propriedade dos diagramas só pode ser transferida para membros da função db_owner. Isso só é possível se o proprietário anterior do diagrama tiver sido removido do banco de dados.
    • Se o proprietário de um diagrama tiver sido removido do banco de dados, o diagrama permanecerá no banco de dados até que um membro da função db_owner tente abri-lo. Nesse ponto, o membro db_owner pode optar por assumir a propriedade do diagrama.

    Então parece que você não será capaz de fazer isso com papéis inferiores como db_datareader.

    Nos bastidores, aqui está o que o Management Studio está chamando para conduzir a lista:

    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
    

    Então você pode ver que isso corresponde à documentação.

    Agora, algumas ideias de solução alternativa:

    • Em um gatilho de logon, atualize o principal_idde todos os diagramas para ser o logon atual. Isso significa que eles terão acesso a todos os diagramas até que a próxima pessoa faça login. Não é o ideal.
    • Use um gatilho na sysdiagramsprópria tabela (não é realmente uma tabela de sistema) e sempre que um diagrama for criado ou atualizado, adicione/atualize uma cópia para cada principal (com seu nome de usuário anexado). Também não é o ideal, e você pode ter pessoas substituindo os diagramas umas das outras durante todo o dia.

    Aqui está uma idéia da segunda solução - tudo o que você realmente precisa manter aqui é uma lista dos principais de banco de dados que você deseja que possam acessar os diagramas (você também desejará ter algo para limpar os diagramas que foram deletados , e também alguma manutenção periódica que exclui diagramas para principais que foram excluídos):

    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
    

    Depois de criar alguns diagramas, veja como era uma versão resumida do Pesquisador de Objetos para esses usuários:

    insira a descrição da imagem aqui

    Agora, dboirá coletar um monte de cópias de diagramas, o que talvez não seja necessário, mas você provavelmente quer que eles sejam o "mestre" na maioria das circunstâncias.

    • 17
  2. Kin Shah
    2013-06-07T05:48:53+08:002013-06-07T05:48:53+08:00

    De acordo com BOL , é necessária uma conta com privilégios dbo de proprietário do banco de dados. Mais informações aqui .

    Assim, o usuário que o criou ou um membro da função db_owner pode abrir diagramas.

    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve