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 / 125617
Accepted
Mohamed Mahyoub
Mohamed Mahyoub
Asked: 2016-01-09 02:40:19 +0800 CST2016-01-09 02:40:19 +0800 CST 2016-01-09 02:40:19 +0800 CST

Como posso descartar todos os gatilhos em um único banco de dados?

  • 772

Tenho um banco de dados com 104 triggers, existe alguma forma de deletar todos os triggers com um único comando de um único banco de dados chamado 'system_db_audits?

sql-server sql-server-2008
  • 4 4 respostas
  • 29527 Views

4 respostas

  • Voted
  1. Best Answer
    Mark Sinkinson
    2016-01-09T02:48:10+08:002016-01-09T02:48:10+08:00

    Você pode usar o SQL dinâmico e o sys.triggersDMV para criar uma consulta que pode ser executada.

    is_ms_shippedexclui quaisquer gatilhos que foram enviados com o SQL Server.
    parent_class_descfiltros para gatilhos de nível de objeto, em vez de nível de banco de dados.

    Altere o PRINTpara an EXECquando estiver satisfeito com a saída.

    USE system_db_audits;
    GO
    
    DECLARE @sql NVARCHAR(MAX) = N'';
    
    SELECT @sql += 
        N'DROP TRIGGER ' + 
        QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id)) + N'.' + 
        QUOTENAME(t.name) + N'; ' + NCHAR(13)
    FROM sys.triggers AS t
    WHERE t.is_ms_shipped = 0
      AND t.parent_class_desc = N'OBJECT_OR_COLUMN';
    
    PRINT @sql;
    
    • 35
  2. AA.SC
    2016-01-09T02:57:50+08:002016-01-09T02:57:50+08:00

    Use Sys.TriggersMeta Data Table que contém uma linha para cada objeto que é um gatilho

    1. Altere o modo de saída para texto clicando no botão da barra de ferramentas mostrado aqui:

    insira a descrição da imagem aqui

    1. Execute este script:

      USE YourDBName
      GO
      SELECT ' GO ' + Char(10) + Char(13) + 'DROP TRIGGER ' 
          + QUOTENAME(OBJECT_SCHEMA_NAME(O.[object_id])) + '.' 
          + QUOTENAME(name)
      FROM sys.sql_modules as M 
          INNER JOIN sys.triggers as O 
              ON M.object_id = O.object_id; 
      
    2. Copie a saída para uma nova janela do SQL Server Management Studio, verifique se o código executa as ações que você espera e execute.

    • 6
  3. jyao
    2016-01-09T23:31:14+08:002016-01-09T23:31:14+08:00

    Caso você queira executar um trabalho sql em um servidor central [ServerA] para fazer o trabalho de exclusão do gatilho, fornecerei uma versão do PowerShell supondo que você tenha uma instância do SQL Server 2012 (ou superior) com o módulo SQLPS instalado no [ServerA]

    Digamos que você queira excluir todos os gatilhos no banco de dados [AdventureWorks] na instância [ServerB] do SQL Server (SQL Server 2005+).

    Você pode executar o seguinte PS em [ServerA]:

    import-module sqlps -DisableNameChecking;
    $db=get-item -Path "sqlserver:\sql\ServerB\default\databases\AdventureWorks";
    
    #before deletion, you can check that triggers do exist
    $db.tables.triggers | select name
    
    #now delete
    $db.tables.triggers |Where-Object {-not $_.IsSystemObject } | foreach-object {$_.drop()};
    
    #check after deletion
    $db.tables.triggers | select name;
    

    Lembre-se de substituir ServerB e AdventureWorks por seus próprios valores.

    Esta é uma solução bastante flexível que você pode personalizar facilmente para se adaptar a outros requisitos diferentes, como apenas excluir gatilhos pertencentes a um conjunto específico de tabelas ou desabilitar (em vez de excluir) alguns gatilhos específicos etc.

    Estritamente falando, as soluções fornecidas por @Mark Sinkinson não estão corretas porque o requisito não é excluir gatilhos no banco de dados 'system_db_audits', mas excluir gatilhos em outro banco de dados de 'system_db_audits'. Isso significa que você precisa criar um sql dinâmico em 'system_db_audits' para envolver o "sql dinâmico" fornecido por @Mark Sinkinson para excluir esses gatilhos de destino, assumindo que 'system_db_audits' e o banco de dados de destino estão na mesma instância do sql server. Caso contrário, se os dois dbs não estiverem na mesma instância, será ainda muito "feio" lidar com a exclusão (como via servidor vinculado etc.). Nesse cenário, o PS é uma solução elegante, não importa onde o banco de dados de destino esteja ou não na mesma instância sql.

    • 2
  4. edelwater
    2020-12-03T10:05:18+08:002020-12-03T10:05:18+08:00

    Para levar em conta o limite da string que contém a string sql:

    SET NUMERIC_ROUNDABORT OFF;
    SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS, NOCOUNT ON;
    SET DATEFORMAT YMD;
    SET XACT_ABORT ON;
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    BEGIN TRANSACTION
    
    DECLARE @items AS CURSOR
    DECLARE @item AS nvarchar(250)
    
    SET @items = CURSOR FOR SELECT N'DROP TRIGGER ' + QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id)) + N'.' + QUOTENAME(t.name) + N'; ' 
        FROM sys.triggers AS t WHERE t.is_ms_shipped = 0 AND t.parent_class_desc = N'OBJECT_OR_COLUMN';
    
    OPEN @items
    FETCH NEXT FROM @items INTO @item
    WHILE @@FETCH_STATUS = 0
    BEGIN    
        EXEC (@item)
        FETCH NEXT FROM @items INTO @item
    END 
    CLOSE @items 
    DEALLOCATE @items
    
    COMMIT TRANSACTION;
    

    Para Views o comando SET seria:

    SET @items = CURSOR FOR SELECT N'DROP VIEW ' + QUOTENAME(OBJECT_SCHEMA_NAME(r.object_id)) + N'.' + QUOTENAME(r.name) + N'; '
    FROM sys.views AS r WHERE r.is_ms_shipped = 0;
    

    Para Stored Procedures o comando SET seria:

    SET @items = CURSOR FOR SELECT N'DROP PROCEDURE ' + QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id)) + N'.' + QUOTENAME(t.name) + N'; '
        FROM sys.procedures AS t WHERE t.is_ms_shipped = 0
    
    • 0

relate perguntas

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

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

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

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 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

    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
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • 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
    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