在SQL触发器或存储过程中获取在程序登录的用户

实现一个AuditLog的功能,是B/S结构专案。

每个用户可以登录系统,在程序中操作数据(添加,更新和删除)需要实现记录操作跟踪。是谁添加,更新和删除的,这些信息将会插入至AuditLog表中。

一般情况之下,在SQL的触发器中,只能取到(SQL验证sa;Windows验证Domain\xxx)。这些用户名,达不到效果,不能真正反映到是谁操作的。

下面是让你清楚,怎样实现在SQL触发器或存储过程中获取在程序登录的用户,是在插入,更新或删除的存储过程,把登录程序当前用户传入进去。在存储过程中,再把相关信息存入局部(#)临时表中,这样子,在触发器即可获取了。

下面代码示例,以一个[Member]表作例,可以参详:

复制代码 代码如下:

Member

CREATE TABLE Member

(

Member_nbr INT IDENTITY(1,1) PRIMARY EKY NOT NULL,

[Name] NVARCHAR(30),

Birthday DATETIME,

Email NVARCHAR(100),

[Address] NVARCHAR(100)

)

GO

插入存储过程:

复制代码 代码如下:

MemberSp_Insert

CREATE PROCEDURE MemberSp_Insert

(

--Other parameter

@Operater NVARCHAR(50) --带到此参数,可从程序的用户传至数据库

)

AS

BEGIN

--处理插入事务

---INSERT INTO [dbo].[Member] (xxx) VALUES(xxx)

--把相关信息存入临时表,方便在触发器时取到。

IF OBJECT_ID('#AuditWho') IS NOT NULL

DROP TABLE [#AuditWho]

CREATE TABLE [#AuditWho] (PrimaryKey INT,Operater NVARCHAR(50))

INSERT INTO [#AuditWho] VALUES(SCOPE_IDENTITY(),@Operater)

END

GO

更新存储过程:

复制代码 代码如下:

MemberSp_Update

CREATE PROCEDURE MemberSp_Update

(

--Other parameter

@Member_nbr INT,

@Operater NVARCHAR(50) --带到此参数,可从程序的用户传至数据库

)

AS

BEGIN

--处理更新事务

---UPDATE [dbo].[Member] SET [xxx] = xxx, ... WHERE [Member_nbr] = @Member_nbr

--把相关信息存入临时表,方便在触发器时取到。

IF OBJECT_ID('#AuditWho') IS NOT NULL

DROP TABLE [#AuditWho]

CREATE TABLE [#AuditWho] (PrimaryKey INT,Operater NVARCHAR(50))

INSERT INTO [#AuditWho] VALUES(@Member_nbr,@Operater)

END

GO

删除存储过程:

复制代码 代码如下:

MemberSp_Delete

CREATE PROCEDURE MemberSp_Delete

(

@Member_nbr INT,

@Operater NVARCHAR(50) --带到此参数,可从程序的用户传至数据库

)

AS

BEGIN

--处理删除事务

---DELETE FROM [dbo].[Member] WHERE [Member_nbr] = @Member_nbr

--把相关信息存入临时表,方便在触发器时取到。

IF OBJECT_ID('#AuditWho') IS NOT NULL

DROP TABLE [#AuditWho]

CREATE TABLE [#AuditWho] (PrimaryKey INT,Operater NVARCHAR(50))

INSERT INTO [#AuditWho] VALUES(@Member_nbr,@Operater)

END

GO

从上面的存储过程,用户相关的信息(应用程序的用户信息)已经在存储过程中存入临时表中,接下来,在触发器,怎样获取呢。可以参考下面的触发器代码:

插入触发器:

复制代码 代码如下:

MemberTr_Insert

CREATE TRIGGER [dbo].[MemberTr_Insert]

ON [dbo].[Member]

FOR INSERT

AS

BEGIN

IF @@ROWCOUNT = 0 RETURN

SET NOCOUNT ON

--事务处理

DECLARE @Operater NVARCHAR(50),@Member_nbr INT

SELECT @Member_nbr = [Member_nbr] FROM inserted

SELECT @Operater = [Operater] FROM [#AuditWho] WHERE [PrimaryKey] = @Member_nbr

--插入Audit 表中

--INSERT INTO ....

END

GO

更新触发器:

复制代码 代码如下:

MemberTr_Update

CREATE TRIGGER [dbo].[MemberTr_Update]

ON [dbo].[Member]

FOR UPDATE

AS

BEGIN

IF @@ROWCOUNT = 0 RETURN

SET NOCOUNT ON

--事务处理

DECLARE @Operater NVARCHAR(50),@Member_nbr INT

SELECT @Member_nbr = [Member_nbr] FROM deleted

SELECT @Operater = [Operater] FROM [#AuditWho] WHERE [PrimaryKey] = @Member_nbr

--插入Audit 表中

--INSERT INTO ....

END

GO

删除触发器:

复制代码 代码如下:

MemberTr_Delete

CREATE TRIGGER [dbo].[MemberTr_Delete]

ON [dbo].[Member]

FOR DELETE

AS

BEGIN

IF @@ROWCOUNT = 0 RETURN

SET NOCOUNT ON

--事务处理

DECLARE @Operater NVARCHAR(50),@Member_nbr INT

SELECT @Member_nbr = [Member_nbr] FROM deleted

SELECT @Operater = [Operater] FROM [#AuditWho] WHERE [PrimaryKey] = @Member_nbr

--插入Audit 表中

--INSERT INTO ....

END

GO

每段代码,有注释。

此问题有在某论坛发表让网友讨论过,但是效果不佳。如果你有另外见解,可以在讨论。谢谢。

时间: 2024-11-08 23:51:24

在SQL触发器或存储过程中获取在程序登录的用户的相关文章

在SQL触发器或存储过程中获取在程序登录的用户_MsSql

实现一个AuditLog的功能,是B/S结构专案. 每个用户可以登录系统,在程序中操作数据(添加,更新和删除)需要实现记录操作跟踪.是谁添加,更新和删除的,这些信息将会插入至AuditLog表中. 一般情况之下,在SQL的触发器中,只能取到(SQL验证sa:Windows验证Domain\xxx).这些用户名,达不到效果,不能真正反映到是谁操作的. 下面是让你清楚,怎样实现在SQL触发器或存储过程中获取在程序登录的用户,是在插入,更新或删除的存储过程,把登录程序当前用户传入进去.在存储过程中,再

android中获取当前程序路径

(1)android中获取当前程序路径 getApplicationContext().getFilesDir().getAbsolutePath() (2)android取已安装的程序列表 List<PackageInfo> packageInfoList =  getPackageManager().getInstalledPackages(0); (3)对安装路径的说明 http://developer.android.com/guide/appendix/install-locatio

SQL Anywhere Studio产品中的应用程序

本文介绍在 SQL Anywhere Studio 产品中与 Adaptive Server Anywhere 一起提供的一些数据库应用程序.这些应用程序可帮助您设计.建立和管理数据库. 您安装哪些组件取决于以下几个方面:正使用的操作系统,在安装软件时所做的选择,以及是独立接收了 Adaptive Server Anywhere 产品还是将 Adaptive Server Anywhere 作为其它产品的一部分安装. 例如,如果您收到的 Adaptive Server Anywhere 是其它产

Asp.net中获取应用程序完整Url路径的小例子_实用技巧

复制代码 代码如下: /// <summary> /// Gets the absolute root /// </summary> public static Uri AbsoluteWebRoot {     get  www.jb51.net    {         var context = HttpContext.Current;         UriBuilder uri = new UriBuilder();         uri.Host = context.

如何获取其他系统登录的用户信息(系统是多系统集成)

问题描述 因为用户信息都是存放在服务器的AD上,用户登录是验证服务器AD的用户信息,验证通过则登录成功.我的工程搭建在一个工程上,工程是多工程构建.但是相互独立. 现在想做到的是:在用户需要登录我的工程时,只要是他登录过其他的分支工程,就不需要再次验证,直接登录. 我的难点在于:无法获取其他系统的用户信息,因为是相互独立的构成,不可能去获取其他工程的session信息. 项目经理的意思是,可以寻找一个IE插件,强制用户安装,用户登录时,来存放他之前填写的登录信息. 请问是否能提供某个能实现该功能

让你提前认识软件开发(28):数据库存储过程中的重要表信息的保存及相关建议

第2部分 数据库SQL语言 数据库存储过程中的重要表信息的保存及相关建议   1. 存储过程中的重要表信息的保存         在很多存储过程中,会涉及到对表数据的更新.插入或删除等,为了防止修改之后的表数据出现问题,同时方便追踪问题,一般会为一些重要的表建立一个对应的debug表.这个debug表中的字段要包括原表的所有字段,同时要增加操作时间.操作码和操作描述等字段信息.         例如,在某项目中,包括了如下一个重要的表tb_XXX: create table tb_XXX (  

Android中获取正在运行的服务-------ActivityManager.RunningServiceInfo的使用

关于PackageManager和ActivityManager的使用 ,自己也写了一些DEMO 了,基本上写的线路参考了Settings模块下的         应用程序,大家如果真正的有所兴趣,建议大家看看源码,不过丑化说在前面,我自己也没怎么看过这方面的源码,只在         需要的时候,才跑过去翻翻.                        今天,在耐着最后一点性子,写下了这篇博文,基本上完成了整个应用程序功能模块的介绍,大家也在此系列上慢慢拓展.     ActivityMa

浅谈sql server的存储过程和触发器

一.存储过程 1.存储过程的分类 存储过程是一种数据库对象,存储在数据库内,可由应用程序通过一个调用执行,而且 允许用户声明变量.有条件执行,具有很强的编程功能 存储过程可以分为两类:系统存储过程.用户存储过程和扩展性存储过程 1).系统存储过程 系统存储过程是由SQL Server系统提供的存储过程,可以作为命令执行各种操作. 系统存储过程主要用来从系统表中获取信息,为系统管理员管理SQL Server提供帮助, 为用户查看数据库对象提供方便. 系统存储过程定义在系统数据库master中,其前

SQL Server存储过程中编写事务处理的方法小结_MsSql

本文实例讲述了SQL Server存储过程中编写事务处理的方法.分享给大家供大家参考,具体如下: SQL Server中数据库事务处理是相当有用的,鉴于很多SQL初学者编写的事务处理代码存往往存在漏洞,本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码.希望能够对您有所帮助. 在编写SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法: begin tran update statement 1 ... update statement 2 ...