SQL Server: Tập lệnh theo dõi bảng mới được Insert, Update trong SQL Server
Khi làm việc với cơ sở dữ liệu SQL Server, việc theo dõi các bảng mới được cập nhật hoặc thêm dữ liệu là rất quan trọng để kiểm soát thay đổi và khắc phục sự cố. Dưới đây là các phương pháp hiệu quả để xác định bảng nào mới được insert hoặc update.
1. Sử dụng System Dynamic Management Views (DMV)
Query cơ bản theo dõi thay đổi trong 24 giờ qua:
SELECT
OBJECT_NAME(object_id) AS TableName,
last_user_update AS LastUpdate,
user_updates AS TotalUpdates,
last_user_seek AS LastSeek,
last_user_scan AS LastScan
FROM
sys.dm_db_index_usage_stats
WHERE
database_id = DB_ID()
AND last_user_update > DATEADD(HOUR, -24, GETDATE())
ORDER BY
last_user_update DESC;
Query chi tiết với thông tin schema:
SELECT
t.name AS TableName,
s.name AS SchemaName,
ius.last_user_update AS LastUpdateTime,
ius.user_updates AS TotalUpdates,
ius.last_user_seek AS LastSeekTime,
ius.last_user_scan AS LastScanTime
FROM
sys.dm_db_index_usage_stats ius
JOIN
sys.tables t ON ius.object_id = t.object_id
JOIN
sys.schemas s ON t.schema_id = s.schema_id
WHERE
ius.database_id = DB_ID()
AND ius.last_user_update > DATEADD(HOUR, -24, GETDATE())
ORDER BY
ius.last_user_update DESC;
Check for recently modified tables:
-- Check for recently modified tables (last 24 hours)
SELECT
OBJECT_NAME(object_id) AS TableName,
last_user_update AS LastUpdate,
user_updates AS TotalUpdates
FROM
sys.dm_db_index_usage_stats
WHERE
database_id = DB_ID()
AND last_user_update > DATEADD(HOUR, -24, GETDATE())
ORDER BY
last_user_update DESC;
Lưu ý: Dữ liệu trong DMV sẽ bị reset mỗi khi SQL Server khởi động lại.
2. Sử dụng Change Tracking (Theo dõi thay đổi)
Bật Change Tracking cho database:
sql
ALTER DATABASE YourDatabaseName
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);
Bật Change Tracking cho bảng cụ thể:
sql
ALTER TABLE YourTableName
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON);
Truy vấn thông tin thay đổi:
sql
SELECT
t.name AS TableName,
CT.SYS_CHANGE_VERSION AS ChangeVersion,
CT.SYS_CHANGE_OPERATION AS Operation,
CT.SYS_CHANGE_COLUMNS AS ChangedColumns,
CT.SYS_CHANGE_CONTEXT AS Context
FROM
CHANGETABLE(CHANGES YourTableName, 0) AS CT
JOIN
sys.tables t ON OBJECT_ID(CT.table_name) = t.object_id
ORDER BY
CT.SYS_CHANGE_VERSION DESC;
3. Sử dụng Change Data Capture (CDC) - Phiên bản Enterprise
Bật CDC cho database:
sql
EXEC sys.sp_cdc_enable_db;
Bật CDC cho bảng cụ thể:
sql
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'YourTableName',
@role_name = NULL,
@capture_instance = N'YourTableName_Instance';
Truy vấn thay đổi:
sql
SELECT *
FROM cdc.dbo_YourTableName_CT
ORDER BY __$start_lsn DESC;
4. Phương pháp thủ công với Timestamp Columns
Thêm cột timestamp vào bảng:
sql
ALTER TABLE YourTableName
ADD
CreatedDate DATETIME DEFAULT GETDATE(),
ModifiedDate DATETIME DEFAULT GETDATE()
Tạo trigger để tự động cập nhật:
sql
CREATE TRIGGER trg_UpdateModifiedDate
ON YourTableName
AFTER UPDATE
AS
BEGIN
UPDATE t
SET ModifiedDate = GETDATE()
FROM YourTableName t
INNER JOIN inserted i ON t.PrimaryKey = i.PrimaryKey
END
Truy vấn các bảng được cập nhật gần đây:
sql
SELECT
TABLE_NAME,
MAX(ModifiedDate) AS LastModified
FROM
INFORMATION_SCHEMA.TABLES t
JOIN
YourTableName ON 1=1
WHERE
ModifiedDate > DATEADD(HOUR, -24, GETDATE())
GROUP BY
TABLE_NAME
ORDER BY
LastModified DESC;
5. Tạo bảng Log để theo dõi thay đổi
Tạo bảng log:
sql
CREATE TABLE ChangeLog (
LogID INT IDENTITY(1,1) PRIMARY KEY,
TableName NVARCHAR(128),
ChangeType NVARCHAR(10),
ChangeTime DATETIME DEFAULT GETDATE(),
UserName NVARCHAR(128) DEFAULT SUSER_SNAME()
);
Tạo trigger để ghi log:
sql
CREATE TRIGGER trg_LogChanges
ON YourTableName
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
DECLARE @ChangeType NVARCHAR(10)
IF EXISTS (SELECT * FROM inserted) AND EXISTS (SELECT * FROM deleted)
SET @ChangeType = 'UPDATE'
ELSE IF EXISTS (SELECT * FROM inserted)
SET @ChangeType = 'INSERT'
ELSE
SET @ChangeType = 'DELETE'
INSERT INTO ChangeLog (TableName, ChangeType)
VALUES ('YourTableName', @ChangeType)
END
Kết luận
Tùy vào nhu cầu và phiên bản SQL Server bạn đang sử dụng, có thể lựa chọn phương pháp phù hợp:
DMV: Nhanh, đơn giản nhưng dữ liệu không tồn tại lâu
Change Tracking: Phù hợp cho ứng dụng cần đồng bộ dữ liệu
CDC: Mạnh mẽ nhưng chỉ có trong phiên bản Enterprise
Timestamp Columns & Triggers: Linh hoạt, hoạt động trên mọi phiên bản
PreviousSQL Server: Tập lệnh để tìm tất cả các giá trị Mặc định với CộtNextSQL Server: Cách khởi động SQLServer bỏ qua Database bị lỗi
Last updated
Was this helpful?