Sql server 如何在最后一分钟添加所有记录

Sql server 如何在最后一分钟添加所有记录,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我是SQL新手。 我正在使用SQLServer2008。 我正在尝试在最后1分钟内从添加的表中获取记录。 实际上,我有一个SP,它每1分钟60秒被调用一次,我没有任何保存修改日期的列,所以我必须选择时间间隔分钟内添加的所有行 可能在最后一分钟内没有添加任何行或添加了N个行,因此我需要以1分钟的计时器间隔添加所有行,因为SP将在每1分钟后被触发。要获取表中在最后一分钟插入的所有记录,在表中需要一个日期字段,该字段要么具有默认的GETDATE约束,要么在插入记录时手动插入日期 SELECT * FR

我是SQL新手。 我正在使用SQLServer2008。 我正在尝试在最后1分钟内从添加的表中获取记录。 实际上,我有一个SP,它每1分钟60秒被调用一次,我没有任何保存修改日期的列,所以我必须选择时间间隔分钟内添加的所有行


可能在最后一分钟内没有添加任何行或添加了N个行,因此我需要以1分钟的计时器间隔添加所有行,因为SP将在每1分钟后被触发。

要获取表中在最后一分钟插入的所有记录,在表中需要一个日期字段,该字段要么具有默认的GETDATE约束,要么在插入记录时手动插入日期

SELECT *
FROM MyTable
WHERE MyDateColumn >= DATEADD(mi, -1, GETDATE())
以及在现有表上创建具有默认值的列:

ALTER TABLE MyTable
ADD MyDateColumn DATETIME2 NOT NULL DEFAULT GETDATE()
您可能可以从sys或INFORMATION_模式中获取表/行元数据,但我不推荐这样做

那么,您的应用程序/数据库是否适合SQL Server审计

更新

这并不能完全回答您的问题,但它可能是一个可行的解决方案。不久前,我编写了一个游标来创建审计触发器并将其应用于数据库中的所有表。触发器设置为记录到当前硬编码的单独表中。您可以根据自己的需要修改它,但我已经包含了下面所有的相关代码。我想您需要删除UserId及其约束:

-- Stores the types of audit entries for the "Logs" table, such as "RECORD CREATED", "RECORD MODIFIED", "RECORD DELETED" and other, miscellaneous log types
CREATE TABLE dbo.LogTypes (
    LogTypeID                   INT             NOT NULL    IDENTITY    PRIMARY KEY,
    [Description]               VARCHAR(100)    NOT NULL    UNIQUE
)

CREATE TABLE dbo.[Logs] (
    LogID                       INT             NOT NULL    IDENTITY    PRIMARY KEY,
    LogTypeID                   INT             NOT NULL    FOREIGN KEY REFERENCES LogTypes(LogTypeID),
    UserID                      INT             NOT NULL    FOREIGN KEY REFERENCES Users(UserID), -- User that created this log entry.
    SysObjectID                 INT, -- The ID of the table in sysobjects (if this is a CRUD insert from a trigger)
    Details                     VARCHAR(1000),
    DateCreated                 DATETIME        NOT NULL    DEFAULT GETDATE()
)

-----------------------------------------------------------------------------
-- Log types
-----------------------------------------------------------------------------
SET IDENTITY_INSERT LogTypes ON

INSERT INTO LogTypes (LogTypeID, [Description])
VALUES(1, 'Record Insert')
INSERT INTO LogTypes (LogTypeID, [Description])
VALUES(2, 'Record Update')
INSERT INTO LogTypes (LogTypeID, [Description])
VALUES(3, 'Record Deletion')
INSERT INTO LogTypes (LogTypeID, [Description])
VALUES(4, 'User logged in')
INSERT INTO LogTypes (LogTypeID, [Description])
VALUES(5, 'User logged out')

SET IDENTITY_INSERT LogTypes OFF
游标代码运行一次:

DECLARE @table_name VARCHAR(500), @instruction VARCHAR(MAX)

DECLARE curTables CURSOR READ_ONLY FAST_FORWARD FOR
 SELECT TABLE_NAME
 FROM INFORMATION_SCHEMA.TABLES
 WHERE TABLE_NAME <> 'Logs'

OPEN curTables

FETCH NEXT FROM curTables INTO @table_name

WHILE @@FETCH_STATUS = 0
    BEGIN

        -- Drop any existing trigger
        SET @instruction = 'IF OBJECT_ID (''tr_' + @table_name + '_Audit'',''TR'') IS NOT NULL DROP TRIGGER tr_' + @table_name + '_Audit;'
        exec sp_sqlexec @instruction

        -- Create the new trigger
        SET @instruction = 'CREATE TRIGGER tr_' + @table_name + '_Audit
        ON ' + @table_name + '
            AFTER INSERT, UPDATE, DELETE 
        AS
            SET NOCOUNT ON

            DECLARE @LogTypeID INT, @SystemUserID INT, @SysObjectID INT, @TableName VARCHAR(500)

            SET @SystemUserID   = 1 -- System account
            SET @TableName      = ''' + @table_name + '''

            IF EXISTS(SELECT * FROM Inserted) AND EXISTS(SELECT * FROM Deleted)
                SET @LogTypeID = 2 -- Update
            ELSE IF EXISTS(SELECT * FROM Inserted)
                SET @LogTypeID = 1 -- Insertion
            ELSE IF EXISTS(SELECT * FROM Deleted)
                SET @LogTypeID = 3 -- Deletion

            SET @LogTypeID = ISNULL(@LogTypeID, 0)

            IF @LogTypeID > 0
                BEGIN
                    -- Only log if successful
                    SELECT
                        @SysObjectID = id
                    FROM sysobjects (nolock)
                    where [name]    = @TableName
                    AND [type]      = ''U''

                    INSERT INTO [Logs] (LogTypeID, UserID, SysObjectID, Details, DateCreated)
                    VALUES(@LogTypeID, @SystemUserID, @SysObjectID, NULL, GETDATE())
                END'
        exec sp_sqlexec @instruction

        FETCH NEXT FROM curTables INTO @table_name
    END

CLOSE curTables
DEALLOCATE curTables

数据库中的每个表现在都会将所有插入、更新和删除记录到日志表中。但是,请注意,向表中添加触发器会增加I/O和内存使用,从而降低性能。不过,这对您来说可能不是一个大问题。

如果没有存储创建和/或修改时间的列,则无法检索所需的信息。您应该添加正在使用的DBMS。博士后?Oracle?sql server 2008。。一般来说,我们不能在特定的时间内检索上次添加的记录。考虑更改表以添加类型DATETIME的新列创建日期和/或修改日期,并将默认值作为GETDATE,它是返回当前DATETIME值的函数。因此,在此之后,您可以使用此列中的一列(您选择的列或两者)查询您的表。但是,我无法使用此解决方案,但这是获取数据的唯一解决方案。它需要在表中修改日期列,而我没有此解决方案,并且我无法添加任何列。无权限,因此我考虑使用其他逻辑。我以前使用过触发器进行审核表-每次添加、修改或删除记录时都将记录插入日志表。我编写了一个游标,将触发器应用于数据库中的每个表。我已经编辑了我的文章,以包括存储过程,以防它很方便。