locked
Change Object Owner RRS feed

  • Pergunta

  • Bom dia Pessoal,
    Recebi um backup de um banco de dados de um cliente, mas acontece que as tabelas não foram criadas através do usuário dbo então executei as seguintes query:

    Select name, uid from sysobjects where type = 'U'
     
    Exec sp_grantdbaccess agiles, agiles
     
    Go
     
    Exec sp_addrolemember db_ddladmin, agiles
     
    Go
     
    Ai consegui  descobrir todas as tabelas  e para mudar a permissão  em cada tabela utilizei a seguinte query:

    Sp_changeobjectowner 'owner.table', 'Login'

    Mas acontece que são muitas tabelas, gostaria de saber se há alguma maneira de fazer isso sem todo esse trabalho, de uma maneira mais prática

    Muito Obrigado
    quarta-feira, 11 de abril de 2007 13:20

Respostas

  • segue

     

         
    Set NoCount On             
    Declare @Tabelas Table (Idx Int Identity(1,1), TblName Varchar(100))             
    Insert into @Tabelas (TblName)             

    Select Table_Schema + '.' + Table_Name From Information_Schema.Tables Where Table_Type = 'Base Table'              
                 
    Declare @Start Int             
    Declare @End Int             
    Declare @Command Varchar(1000)             
                 
    Select @Start = 1, @end = Max(Idx) From @Tabelas             
    While @Start <= @End             
    Begin             
         Select @Command = 'Sp_changeobjectowner ''' + TblName + ''',''Login''' From @Tabelas Where Idx = @Start             
         Print @Command
         exec(@Command)             
     Set @Start = @Start + 1             
    End           
               
             
           
         
       
     
    agora cuidado pos este select vai ser aplicado a todas as tabelas que estiverem dentro da variavel table que foi alimentada pela information_schema

     

    Abs;

    quarta-feira, 11 de abril de 2007 15:58
  • Olá Du_Rodrigues...o script abaixo também pode ser uma ótima alternativa.

     

    Basta executá-lo no banco desejado, pegar o resultado e executar.

     

    --Lista todos os objetos com owner <> de dbo

    select 'exec sp_changeobjectowner '''+ b.name+ '.' +a.name +''',''dbo'''

    from sysobjects a Join sysusers b on a.uid = b.uid where a.uid <>1

     

    Qualquer coisa é só trocar dbo pelo login desejado.

     

    Um abraço
    Nilton Pinheiro
    www.mcdbabrasil.com.br

    segunda-feira, 16 de abril de 2007 17:37
    Moderador

Todas as Respostas

  • segue

     

         
    Set NoCount On             
    Declare @Tabelas Table (Idx Int Identity(1,1), TblName Varchar(100))             
    Insert into @Tabelas (TblName)             

    Select Table_Schema + '.' + Table_Name From Information_Schema.Tables Where Table_Type = 'Base Table'              
                 
    Declare @Start Int             
    Declare @End Int             
    Declare @Command Varchar(1000)             
                 
    Select @Start = 1, @end = Max(Idx) From @Tabelas             
    While @Start <= @End             
    Begin             
         Select @Command = 'Sp_changeobjectowner ''' + TblName + ''',''Login''' From @Tabelas Where Idx = @Start             
         Print @Command
         exec(@Command)             
     Set @Start = @Start + 1             
    End           
               
             
           
         
       
     
    agora cuidado pos este select vai ser aplicado a todas as tabelas que estiverem dentro da variavel table que foi alimentada pela information_schema

     

    Abs;

    quarta-feira, 11 de abril de 2007 15:58
  • Muito obrigado pela ajuda me ajudou e muito
    quarta-feira, 11 de abril de 2007 18:47
  • Olá Du_Rodrigues...o script abaixo também pode ser uma ótima alternativa.

     

    Basta executá-lo no banco desejado, pegar o resultado e executar.

     

    --Lista todos os objetos com owner <> de dbo

    select 'exec sp_changeobjectowner '''+ b.name+ '.' +a.name +''',''dbo'''

    from sysobjects a Join sysusers b on a.uid = b.uid where a.uid <>1

     

    Qualquer coisa é só trocar dbo pelo login desejado.

     

    Um abraço
    Nilton Pinheiro
    www.mcdbabrasil.com.br

    segunda-feira, 16 de abril de 2007 17:37
    Moderador
  • Nilton,

     

    Legal o script pequeno, simples, mas muito prático.

     

    É a cada dia eu aprendo mais nestes fórums.

     

    Valeu.

    segunda-feira, 16 de abril de 2007 20:35
    Moderador
  • Olá Du_Rodrigues...o script abaixo também pode ser uma ótima alternativa.

     

    Basta executá-lo no banco desejado, pegar o resultado e executar.

     

    --Lista todos os objetos com owner <> de dbo

    select 'exec sp_changeobjectowner ''' + b. name+ '.' + a. name + ''',''dbo'''

    from sysobjects a Join sysusers b on a. uid = b. uid where a. uid <> 1

     

    Qualquer coisa é só trocar dbo pelo login desejado.

     

    Um abraço
    Nilton Pinheiro
    www.mcdbabrasil.com.br

    Boa Tarde,

    Executei este script em um ambiente de Teste, e obtive 1819 registros de retorno, em um ambiente que tem apenas 2 bases criadas e funcionando.

    Pergunta: Alterando todos objetos da instância para terem como owner o "dbo", não corre-se o risco de algum deixar de funcionar, por algum privilégio expecial, que este owner não tenha, ou mesmo, uma view, que teria permissões restritas, passar a ter super privilégios, após esta alteração ???

    Muito Obrigado...
    quarta-feira, 14 de outubro de 2009 19:31