通常的做法是用SESSION_USER这个,但我的数据库设计的是Windows用户认证,所以便当时没有用户名、密码。所有的ASP.NET网页也都是以这种方式登录的数据库查询。
现在做触发器遇到问题了,SESSION_USER这个值永远是dbo,因为我的用户名、密码只是数据表中的一个字段,用户登录网页的时候,我只是用user表中的数据对比用户输入的数据。我曾经想过,在数据库中新建个"当前用户"表,但一想,就不对了,要是多个用户登录,大家来回改这个表里的值。求高手指点吧
现在做触发器遇到问题了,SESSION_USER这个值永远是dbo,因为我的用户名、密码只是数据表中的一个字段,用户登录网页的时候,我只是用user表中的数据对比用户输入的数据。我曾经想过,在数据库中新建个"当前用户"表,但一想,就不对了,要是多个用户登录,大家来回改这个表里的值。求高手指点吧
比如有用户改了一条记录,我要在触发器里知道是谁改的,当然,如果是登录到SQL Server所在的操作系统改的,直接就记录是dbo也没关系,就是说用网站页面操作的话,怎么知道呢?
你数据库表中的用户通过网页修改数据库记录,比如修改记录时间(不一定是自己的)。此时你在数据库中的update触发器需要知道用户名,以便写入log,大概齐是我说的意思么?
如果是,那么数据库是不知道你的当前用户是谁的。除非你传用户参数。
如果不是我能想到的是你只能取连接某库的连接登录名。其他的我还真不知道怎么取。
微软的标准做法,登录触发器,登录的时候给每个用户建一个临时表,并且在表里赋值当前用户是谁,触发器里从这个临时表里查当前用户
@USERID =LOGINAME, --连接的时候使用的哪个SQL登陆用户
@HOSTNAME =HOSTNAME, --客户端的机器名
@LOGINID =NT_USERNAME, --客户端的登陆用户(OS的用户)
@APPNAME =PROGRAM_NAME --是从查询分析器,还是应用程序来执行的
FROM MASTER..SYSPROCESSES
WHERE SPID=@@SPID