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