网络编程
位置:首页>> 网络编程>> 数据库>> 在SQL触发器或存储过程中获取在程序登录的用户

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

 来源:asp之家 发布时间:2012-01-29 18:01:32 

标签: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


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

0
投稿

猜你喜欢

  • 【MySql常用命令】1:使用SHOW语句找出在服务器上当前存在什么数据库:mysql> SHOW DATABASES;2:创建一个数
  • 任何位置都能明确“我在哪里?这里有什么?从这里能去哪里?” 小时候,童话故事都告诉我们,迷路可不是一件好事。那会伴随着困惑、沮丧、
  • 利用 CSS 框架,可以简化你的工作,提高工作效率。CSS 框架是一系列 CSS 文件的集合体,包含了基本的元素重置,页面排版、网格布局、表
  • 如何用Cookie进行登录验证?很简单,看看这两个文件:login.htm请注册登录随风起舞<FORM ACTION=&qu
  • 最近笔者学会了用FrontPage XP做网页,心理特高兴,非常想把我在制作主页过程中的一些经验和大家交流交流、切磋切磋,我们一起来看看吧。
  • 数据库连接:<% set conn=server.createobject("adodb.connection&q
  • 偶第一次发主题, 这个是在一个项目中的做...写的一般般, 有什么bug之类的是在所难免, 望见谅功能说明:1. 即时控制用户输入2. 将输
  • 如何显示SQL数据库所有表的名称?<%strSQLDSN = "xxxx"strSQLUser
  • ACCESS数据库在用的过程中,经常不断的进行删除和增加记录的操作,会出现以下问题:1、可能会使Update语句更新失败,明明一条记录存在,
  • 平常我们使用js代码获取的时间都是客户端的时间,那么有什么办法在浏览器中显示的是服务器断的时间吗?请看下面代码:<span id=&q
  • 本来在网上有不少关于这方面的文章,可是我找了好久也没看到把(可能我的搜索水平有线把)不过倒是聊天室的很多。如何统计会员再线状态,希望对刚开始
  • 前言 日益增长的分布式应用需求要求实现更好分布式的软件环境,不断推动着分布式技术的进步。Oracle数据复制是实现分布式数据环境的一种技术,
  • 一、问题描述 SQL Plus WorkSheet是一个窗口图形界面的SQL语句编辑器,对于那些喜欢窗口界面而不喜欢字符界面的用户,该工具相
  • 我以centos 4.4 下面的mysql 5.0.33 手工编译版本为例说明:vi /usr/local/mysql/bin/m
  • 一、单字节SQL注入MYSQL的SQL注入已经由来已久,以下是普遍采用的注入步骤:1、在GET参数上加一个/*或者#(mysql专有的注释)
  • 如何让我的网页自动适应客户端的屏幕分辨率?然后用下列办法进行自动推送:<% @language="vbscript
  • SQL Server 2005的新功能为动态管理对象,它们是在指定时间返回某个数据库实例的特殊状态信息的数据库视图或函数。这些对象允许数据库
  • 因为神奇的中文有时也是会遇到国外同学都不知道原因导致一些神奇滴问题,所以要用更神奇的英文来解决问题。Mac OS的一些:华文细黑:STHei
  • 今天逛论坛时看到有朋友问,是否有专门教Javascript的学校,这里想想把自己的一点建议和自己3年来的前端Javascript开发的经验跟
  • 上文: 《IE7的web标准之道——1:前言(兼目录)》IE历来被web标准的拥护者所诟病,而当FireFox横空出世以后,更多的网页制作者
手机版 网络编程 asp之家 www.aspxhome.com