Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何获取客户端IP地址和存储过程更新历史记录?_Sql_Sql Server_Database_Stored Procedures_Sql Server 2012 - Fatal编程技术网

Sql 如何获取客户端IP地址和存储过程更新历史记录?

Sql 如何获取客户端IP地址和存储过程更新历史记录?,sql,sql-server,database,stored-procedures,sql-server-2012,Sql,Sql Server,Database,Stored Procedures,Sql Server 2012,我正在服务器中使用示例数据库(名称EX:rr)。在示例数据库中,我有存储过程,员工可以访问这些存储过程。现在我的问题是某个实体修改了一个存储过程(例如:SP_EmpInsert)。现在我想知道该存储过程在被修改时的历史,以及在哪台计算机(计算机的IP地址)中被修改 我引用了这个链接 首先我们需要创建数据库 需要创建表来存储日志 需要插入我们需要为其创建日志的存储过程 最后,我们需要创建DDL触发器 有关详细说明,请参阅链接 用户和权限如何?不要授予任何人不需要的东西。每日提示:SVN。简单地说,

我正在服务器中使用示例数据库(名称EX:rr)。在示例数据库中,我有存储过程,员工可以访问这些存储过程。现在我的问题是某个实体修改了一个存储过程(例如:SP_EmpInsert)。现在我想知道该存储过程在被修改时的历史,以及在哪台计算机(计算机的IP地址)中被修改

我引用了这个链接 首先我们需要创建数据库

需要创建表来存储日志

需要插入我们需要为其创建日志的存储过程

最后,我们需要创建DDL触发器

有关详细说明,请参阅链接

用户和权限如何?不要授予任何人不需要的东西。每日提示:SVN。简单地说,你不能。无法直接获取特定修改的ip地址:如果可以检索会话,则可以访问ip,但在进行修改之前必须启用审核。此外,寻找修饰符也很奇怪:通常在结构上操作的人很少且“友好”(不愿意制造问题…。@Dineshala为将来添加DDL触发器并记录所有DDL操作。现在已经很晚了。其次,将数据库的所有脚本存储在版本控制中,如Git/SVN。最后准备DEV/TEST/PROD环境,不允许DEV匿名更改PROD环境。@Dineshala为每个开发人员创建唯一的用户名
CREATE DATABASE HistoryDB;
GO
USE HistoryDB;
GO

CREATE TABLE dbo.tbl_SPHistory
(
    EventDate    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    EventType    NVARCHAR(64),
    EventDDL     NVARCHAR(MAX),
    EventXML     XML,
    DatabaseName NVARCHAR(255),
    SchemaName   NVARCHAR(255),
    ObjectName   NVARCHAR(255),
    HostName     VARCHAR(64),
    IPAddress    VARCHAR(32),
    ProgramName  NVARCHAR(255),
    LoginName    NVARCHAR(255)
);
INSERT HistoryDB.dbo.tbl_SPHistory
(
    EventType,
    EventDDL,
    DatabaseName,
    SchemaName,
    ObjectName,
    LoginName
)
SELECT
    'CREATE_PROCEDURE',
    OBJECT_DEFINITION([object_id]),
    DB_NAME(),
    OBJECT_SCHEMA_NAME([object_id]),
    OBJECT_NAME([object_id]),
    'my name'
FROM
    sys.procedures;
USE YourDatabase;
GO

CREATE TRIGGER DDLTrigger_Sample
    ON DATABASE
    FOR CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE
        @EventData XML = EVENTDATA();

    DECLARE 
        @ip VARCHAR(32) =
        (
            SELECT client_net_address
                FROM sys.dm_exec_connections
                WHERE session_id = @@SPID
        );

    INSERT HistoryDB.dbo.tbl_SPHistory
    (
        EventType,
        EventDDL,
        EventXML,
        DatabaseName,
        SchemaName,
        ObjectName,
        HostName,
        IPAddress,
        ProgramName,
        LoginName
    )
    SELECT
        @EventData.value('(/EVENT_INSTANCE/EventType)[1]',   'NVARCHAR(100)'), 
        @EventData.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'NVARCHAR(MAX)'),
        @EventData,
        DB_NAME(),
        @EventData.value('(/EVENT_INSTANCE/SchemaName)[1]',  'NVARCHAR(255)'), 
        @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]',  'NVARCHAR(255)'),
        HOST_NAME(),
        @ip,
        PROGRAM_NAME(),
        SUSER_SNAME();
END
GO