none
Recuperar o database anexado(Attach) RRS feed

Respostas

  • Eu fiz um teste usando Police Based Management. Não vai fazer exatamente o que você quer, mas ao menos você terá a informação.

    O que eu fiz foi pegar e criar uma condition com a data de criação da base, se for maior do que uma determinada data, ele vai gerar informação no Evaluate daquela Policy.

    SEgue o exemplo:

    Declare @condition_id int
    EXEC msdb.dbo.sp_syspolicy_add_condition @name=N'Database CreateDate', @description=N'', @facet=N'Database', @expression=N'<Operator>
      <TypeClass>Bool</TypeClass>
      <OpType>LE</OpType>
      <Count>2</Count>
      <Attribute>
        <TypeClass>DateTime</TypeClass>
        <Name>CreateDate</Name>
      </Attribute>
      <Function>
        <TypeClass>DateTime</TypeClass>
        <FunctionType>DateTime</FunctionType>
        <ReturnType>DateTime</ReturnType>
        <Count>1</Count>
        <Constant>
          <TypeClass>String</TypeClass>
          <ObjType>System.String</ObjType>
          <Value>2013-12-19T00:00:00.0000000</Value>
        </Constant>
      </Function>
    </Operator>', @is_name_condition=0, @obj_name=N'', @condition_id=@condition_id OUTPUT
    Select @condition_id
    
    GO
    
    Declare @object_set_id int
    EXEC msdb.dbo.sp_syspolicy_add_object_set @object_set_name=N'policy_ObjectSet', @facet=N'Database', @object_set_id=@object_set_id OUTPUT
    Select @object_set_id
    
    Declare @target_set_id int
    EXEC msdb.dbo.sp_syspolicy_add_target_set @object_set_name=N'policy_ObjectSet', @type_skeleton=N'Server/Database', @type=N'DATABASE', @enabled=True, @target_set_id=@target_set_id OUTPUT
    Select @target_set_id
    
    EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database', @level_name=N'Database', @condition_name=N'', @target_set_level_id=0
    
    
    GO
    
    Declare @policy_id int
    EXEC msdb.dbo.sp_syspolicy_add_policy @name=N'Teste', @condition_name=N'Database CreateDate', @policy_category=N'', @description=N'', @help_text=N'', @help_link=N'', @schedule_uid=N'00000000-0000-0000-0000-000000000000', @execution_mode=0, @is_enabled=False, @policy_id=@policy_id OUTPUT, @root_condition_name=N'', @object_set=N'policy_ObjectSet'
    Select @policy_id
    
    
    GO


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    • Sugerido como Resposta Junior Galvão - MVPMVP sexta-feira, 20 de dezembro de 2013 16:13
    • Marcado como Resposta Giovani Cr quarta-feira, 25 de dezembro de 2013 10:39
    quinta-feira, 19 de dezembro de 2013 20:05
    Moderador
  • Olá Roberto!

    Acabei conseguindo com EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]','nvarchar(max)'). Porem via trigger nao posso usar o comando "USE", para acessar o database e negar permição a ele.
    Conhece algum comando do tipo DENY onde eu informo o database no mesmo comando?

    • Marcado como Resposta Giovani Cr quarta-feira, 25 de dezembro de 2013 10:39
    sexta-feira, 20 de dezembro de 2013 16:35

Todas as Respostas

  • Olá,

         Talvez uma alternativa seja recuperar via EVENT_DATA()... Você pode explicar melhor o que está querendo fazer?


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    quinta-feira, 19 de dezembro de 2013 19:28
    Moderador
  • Olá, posso sim.

    Preciso limitar um database de forma que outra pessoa não consiga anexa-lo. porem não posso mudar características do usuário.

    tentei limitar com trigger_ddl porem nao encontrei uma forma de bloquear o attach. 

    pensei em excluir o usuário corrente do database anexado, por isso preciso do database.

    Estou aberto a sugestões.

    Obrigado.

    quinta-feira, 19 de dezembro de 2013 19:36
  • Eu fiz um teste usando Police Based Management. Não vai fazer exatamente o que você quer, mas ao menos você terá a informação.

    O que eu fiz foi pegar e criar uma condition com a data de criação da base, se for maior do que uma determinada data, ele vai gerar informação no Evaluate daquela Policy.

    SEgue o exemplo:

    Declare @condition_id int
    EXEC msdb.dbo.sp_syspolicy_add_condition @name=N'Database CreateDate', @description=N'', @facet=N'Database', @expression=N'<Operator>
      <TypeClass>Bool</TypeClass>
      <OpType>LE</OpType>
      <Count>2</Count>
      <Attribute>
        <TypeClass>DateTime</TypeClass>
        <Name>CreateDate</Name>
      </Attribute>
      <Function>
        <TypeClass>DateTime</TypeClass>
        <FunctionType>DateTime</FunctionType>
        <ReturnType>DateTime</ReturnType>
        <Count>1</Count>
        <Constant>
          <TypeClass>String</TypeClass>
          <ObjType>System.String</ObjType>
          <Value>2013-12-19T00:00:00.0000000</Value>
        </Constant>
      </Function>
    </Operator>', @is_name_condition=0, @obj_name=N'', @condition_id=@condition_id OUTPUT
    Select @condition_id
    
    GO
    
    Declare @object_set_id int
    EXEC msdb.dbo.sp_syspolicy_add_object_set @object_set_name=N'policy_ObjectSet', @facet=N'Database', @object_set_id=@object_set_id OUTPUT
    Select @object_set_id
    
    Declare @target_set_id int
    EXEC msdb.dbo.sp_syspolicy_add_target_set @object_set_name=N'policy_ObjectSet', @type_skeleton=N'Server/Database', @type=N'DATABASE', @enabled=True, @target_set_id=@target_set_id OUTPUT
    Select @target_set_id
    
    EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database', @level_name=N'Database', @condition_name=N'', @target_set_level_id=0
    
    
    GO
    
    Declare @policy_id int
    EXEC msdb.dbo.sp_syspolicy_add_policy @name=N'Teste', @condition_name=N'Database CreateDate', @policy_category=N'', @description=N'', @help_text=N'', @help_link=N'', @schedule_uid=N'00000000-0000-0000-0000-000000000000', @execution_mode=0, @is_enabled=False, @policy_id=@policy_id OUTPUT, @root_condition_name=N'', @object_set=N'policy_ObjectSet'
    Select @policy_id
    
    
    GO


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    • Sugerido como Resposta Junior Galvão - MVPMVP sexta-feira, 20 de dezembro de 2013 16:13
    • Marcado como Resposta Giovani Cr quarta-feira, 25 de dezembro de 2013 10:39
    quinta-feira, 19 de dezembro de 2013 20:05
    Moderador
  • Olá Roberto!

    Acabei conseguindo com EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]','nvarchar(max)'). Porem via trigger nao posso usar o comando "USE", para acessar o database e negar permição a ele.
    Conhece algum comando do tipo DENY onde eu informo o database no mesmo comando?

    • Marcado como Resposta Giovani Cr quarta-feira, 25 de dezembro de 2013 10:39
    sexta-feira, 20 de dezembro de 2013 16:35