Làm thế nào tôi có thể thả tất cả các kích hoạt trong một cơ sở dữ liệu?


17

Tôi có một cơ sở dữ liệu với 104 trình kích hoạt, có cách nào để xóa tất cả các trình kích hoạt bằng một lệnh duy nhất từ ​​một cơ sở dữ liệu duy nhất được gọi là 'system_db_audits không?

Câu trả lời:


29

Bạn có thể sử dụng SQL động và sys.triggersDMV để xây dựng truy vấn mà bạn có thể thực hiện.

is_ms_shippedkhông bao gồm bất kỳ trình kích hoạt nào được cung cấp với SQL Server.
parent_class_descbộ lọc cho các kích hoạt mức đối tượng, thay vì mức cơ sở dữ liệu.

Thay đổi PRINTthành một EXEClần bạn hài lòng với đầu ra.

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;

5

Sử dụng Sys.TriggersBảng dữ liệu Meta chứa một hàng cho mỗi đối tượng là trình kích hoạt

  1. Thay đổi chế độ đầu ra thành văn bản bằng cách nhấp vào nút thanh công cụ hiển thị ở đây:

nhập mô tả hình ảnh ở đây

  1. Thực thi tập lệnh này:

    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. Sao chép đầu ra vào cửa sổ SQL Server Management Studio mới, xác minh mã thực hiện các hành động bạn đang mong đợi và Thực thi.


Đừng DROP TRIGGERtuyên bố cần chấm dứt ;mặc dù?
ypercubeᵀᴹ

MSDN nói: Bộ kết thúc câu lệnh Transact-SQL. Mặc dù dấu chấm phẩy không bắt buộc đối với hầu hết các câu lệnh trong phiên bản SQL Server này, nhưng nó sẽ được yêu cầu trong phiên bản tương lai.
AA.SC

2

Trong trường hợp bạn muốn chạy một công việc sql trên máy chủ trung tâm [ServerA] để thực hiện công việc xóa kích hoạt, tôi sẽ cung cấp phiên bản PowerShell giả sử bạn có phiên bản SQL Server 2012 (hoặc cao hơn) với mô-đun SQLPS được cài đặt trên [ServerA]

Giả sử bạn muốn xóa tất cả các kích hoạt trong cơ sở dữ liệu [AdventureWorks] trên phiên bản SQL Server [ServerB] (SQL Server 2005+).

Bạn có thể chạy PS sau trên [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;

Hãy nhớ thay thế ServerBAdventureWorks bằng các giá trị của riêng bạn.

Đây là giải pháp khá linh hoạt mà bạn có thể dễ dàng tùy chỉnh để thích ứng với các yêu cầu khác nhau, chẳng hạn như chỉ xóa các kích hoạt thuộc một nhóm bảng cụ thể hoặc vô hiệu hóa (thay vì xóa) một số kích hoạt cụ thể, v.v.

Nói một cách chính xác, các giải pháp được cung cấp bởi @Mark Sinkinson là không chính xác vì yêu cầu không phải là xóa các kích hoạt trên 'system_db_audits' db, mà là xóa các kích hoạt trong một db khác từ 'system_db_audits'. Điều này có nghĩa là bạn cần tạo một sql động trong 'system_db_audits' để bọc "sql động" được cung cấp bởi @Mark Sinkinson để xóa các kích hoạt mục tiêu giả định rằng cả 'system_db_audits' và db đích đều nằm trên cùng một máy chủ sql. Mặt khác, nếu hai dbs không nằm trong cùng một thể hiện, thì sẽ rất "xấu" khi xử lý việc xóa (chẳng hạn như thông qua máy chủ được liên kết, v.v.). Trong kịch bản như vậy, PS là một giải pháp tao nhã cho dù db mục tiêu ở đâu hay không nằm trên cùng một đối tượng sql.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.