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

来源:脚本之家  责任编辑:小易  

先创建表:create table a(pid char(30),price char(10),ptime smalldatetime,gid char(10));create table b(pid char(30),price1 char(10),price2 char(10),ptime1 smalldatetime,gid1 char(10));创建触发器:create trigger insertlaston b after insert asbegindeclare@price2 char(10),@ptime1 smalldatetime,@gid1 char(10),@pid char(30);set@pid=(select pid from inserted);set@price2=(select top 1 price from a where pid=(select pid from inserted)order by ptime desc);set@ptime1=(select top 1 ptime from a where pid=(select pid from inserted)order by ptime desc);set@gid1=(select top 1 gid from a where pid=(select pid from inserted)order by ptime desc);update b set price2=price2,ptime1=ptime1,gid1=gid1where b.pid=pid;end;数据表的字段属性不一定符合你的要求,你可以适当改正。经测试,通过!www.zgxue.com防采集请勿采集本网。

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

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

一个简单的例子。触发器功能:当表TB_A有一条数据插入后,触发,获取该条数据的AID,AText字段值,插入到表TB_B中。create Trigger[dbo].[rece] on[dbo].[TB_A] After insert as declare@strText

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

每一种数据库系统的存储过程、触发器的写法都会有不同,包括变量的定义格式等,都可能有差异。我没有用过oracle,只懂informix、SQLServer。最好的办法是找本书,或者看联机帮助(不知道oracle有

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

例如:CREATE PROCEDURE 读者借阅情况 no varchar(8) as select 读者.读者编号,姓名,图书.书号,书名,借阅日期,借出否 as 归还否(as用于改名) from 读者,图书,借阅 where 读者.读者编号=借阅.读者

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

低级问题~数据库关键字段加个索引不就行了 mysql应该也有这个功能吧~这种问题数据库都给你解决好了 给你大哥加分吧

复制代码 代码如下:

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

每段代码,有注释。

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

你可以在触发器上调用存储过程,触发器中有两个临时表inserted 和deleted,这两个表的表结构和创建触发器的表是一样的,inserted表存的是当前插入或更新后的值,deleted表存的是当前删除或修改前的值.你可以利用以上两个临时表的值来获得你要的参数值,然后调用时传入存储过程另外你也可以直接在触发器中操作,不用存储过程内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • sql进行排序、分组、统计的10个新技巧分享
  • sql server中减小log文件尺寸的方法分享
  • 存储过程的输出参数,返回值与结果集
  • sql server误区30日谈 第9天 数据库文件收缩不会影响性能
  • sql server允许重复空字段不空字段值唯一
  • sql分类汇总及select的自增长脚本
  • sql函数实现去除字符串中的相同的字符串
  • sql分页查询几种写法
  • 隐藏在sqlserver 字段中的超诡异字符解决过程
  • 新手sqlserver数据库dba需要注意的一些小细节
  • SQL 从触发器获得的值发送到存储过程中获取不到结果集?
  • 求教:SQL中触发器、存储过程(SQL 2000)
  • SQL SERVER 2008 触发器中怎么将参数传递给存储过程中的输入参数@sno
  • 在sql触发器中如何获得被修改行的ID
  • 急急急!!SQL的触发器和存储过程怎么写啊?懂的说还,还有他两分别是什么意思?
  • SQL存储过程如何学习?
  • SQL Server2005 触发器 与 存储过程
  • 对于大量数据(几千万条)的查询,筛选不用触发器或者存储过程,有没有可能用程序实现高效的查询?
  • SQL server格式的触发器和存储过程改写成mysql格式的要怎么做?
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页mssqlsql进行排序、分组、统计的10个新技巧分享sql server中减小log文件尺寸的方法分享存储过程的输出参数,返回值与结果集sql server误区30日谈 第9天 数据库文件收缩不会影响性能sql server允许重复空字段不空字段值唯一sql分类汇总及select的自增长脚本sql函数实现去除字符串中的相同的字符串sql分页查询几种写法隐藏在sqlserver 字段中的超诡异字符解决过程新手sqlserver数据库dba需要注意的一些小细节sql server 2012 安装图解教程(附sql server数据库入门学习总结microsoft sql server 2012 数据sql重复记录查询的几种方法win7系统安装sqlserver2000的详细sqlserver中distinct的用法(不重sql server错误代码大全及解释(sql-order by 多字段排序(升序、sql将一个表中的数据插入到另一个用sql语句添加删除修改字段、一些sql server 常用的几个数据类型sql server中聚合历史备份信息对比数据库sqlserver 数据库压缩与数据库日志(ldf)压sql server bulk insert 只需要部分字段时sql语言查询基础:连接查询 联合查询 代码sql server误区30日谈 第22天 资源调控器浅析sql数据操作语句实例讲解sql server加密功能sqlldr装载数据实现代码sqlserver中模糊查询对于特殊字符的处理方
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved