查找何时添加列

问题描述 投票:0回答:1

在 SQL Server 中,有什么方法可以获取有关何时创建列或哪些列是新列的信息?另外,我需要查找列中的任何更改,例如哪些列的数据类型发生了更改。我可以获取表的创建和最后修改日期,但对于列,我找不到任何查询来执行此操作。

我尝试使用触发器、审计和在论坛中找到的其他查询,但没有得到我想要的结果。如果有人知道解决方案,请帮忙。第三方工具也是可以接受的。 提前致谢。 这是我的触发代码(我知道它不是最好的,但我尽力了):

DROP TABLE IF EXISTS ColumnChanges
CREATE TABLE ColumnChanges (
Id INT IDENTITY(1,1) PRIMARY KEY,
DatabaseName NVARCHAR(100),
TableName NVARCHAR(100),
ColumnName NVARCHAR(100),
ActionType NVARCHAR(50),
OldDataType NVARCHAR(50),
NewDataType NVARCHAR(50),
Add_Modify_Date DATETIME
)


CREATE TRIGGER trg_ColumnChange_AfterAlter
ON DATABASE
FOR ALTER_TABLE
AS
BEGIN
DECLARE @EventData XML
SET @EventData = EVENTDATA()

DECLARE @DatabaseName NVARCHAR(100)
DECLARE @TableName NVARCHAR(100)
DECLARE @ActionType NVARCHAR(50)
DECLARE @NewDataType NVARCHAR(100)
DECLARE @Add_Modify_Date DATETIME

SET @DatabaseName = @EventData.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'NVARCHAR(100)')
SET @TableName = @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(100)')
SET @ActionType = 'ADDED/MODIFIED'
SET @NewDataType = @EventData.value('(/EVENT_INSTANCE/AlterTableActionList/Alter/Columns/Column/DataTypeWithCollation)[1]', 'NVARCHAR(100)')
SET @Add_Modify_Date = GETDATE()

DECLARE @ColumnName NVARCHAR(100)
    SELECT @ColumnName = COLUMN_NAME    
        FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE TABLE_NAME = @TableName

DECLARE @OldDataType NVARCHAR(100)
        SELECT @OldDataType = DATA_TYPE 
        FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE COLUMN_NAME = @ColumnName


INSERT INTO ColumnChanges (DatabaseName, TableName, ColumnName, ActionType,OldDataType,NewDataType, Add_Modify_Date)
VALUES (@DatabaseName, @TableName, @ColumnName, @ActionType, @OldDataType, @NewDataType, @Add_Modify_Date)
  END
sql-server triggers audit schemachange
1个回答
0
投票

您的触发器存在一些问题。 首先,您无法从事件数据中获取数据类型,该信息似乎没有被跟踪。但是您可以通过查询视图来获取当前的数据类型。不幸的是,您的代码没有正确选择正确的列名称。

改进版:


CREATE OR ALTER TRIGGER trg_ColumnChange_AfterAlter
ON DATABASE
FOR ALTER_TABLE
AS
BEGIN
    DECLARE @EventData XML = EVENTDATA()
    
    INSERT INTO ColumnChanges (DatabaseName, TableName, ColumnName, ActionType,OldDataType,NewDataType, Add_Modify_Date)
    SELECT  e.value('(DatabaseName/text())[1]', 'sysname')
    ,   e.value('(ObjectName/text())[1]', 'sysname')
    ,   c.value('(Name/text())[1]', 'sysname')
    ,   c.value('local-name(..)', 'nvarchar(100)')
    ,   NULL /*not possible to get*/, sc.DATA_TYPE
    ,   e.value('(PostTime/text())[1]', 'datetime2')
    FROM    @EventData.nodes('/EVENT_INSTANCE') e(e)
    CROSS APPLY e.nodes('AlterTableActionList/*/Columns') c(c)
    LEFT JOIN INFORMATION_SCHEMA.COLUMNS sc
           ON   sc.TABLE_NAME = e.value('(ObjectName/text())[1]', 'sysname')
           AND  sc.COLUMN_NAME = c.value('(Name/text())[1]', 'sysname')
END

这支持多个表和列,并且支持添加/修改。

© www.soinside.com 2019 - 2024. All rights reserved.