8

如何将列的默认值设置为登录用户?

我正在创建一个“日志记录”表,其中一列应该是登录用户

(the output of "SELECT user();"). 

这可能吗?

编辑——我试过的:

create trigger logtrigger_test before insert on logging_test for each row set new.changed_by=current_user();

编辑2:描述表

+---------------+-------------+------+-----+-------------------+-----------------------------+
| Field         | Type        | Null | Key | Default           | Extra                       |
+---------------+-------------+------+-----+-------------------+-----------------------------+
| id            | int(11)     | NO   | PRI | NULL              | auto_increment              |
| source_table  | varchar(50) | NO   |     | NULL              |                             |
| foreign_id    | int(11)     | NO   |     | NULL              |                             | 
| field_changed | varchar(30) | NO   |     | NULL              |                             | 
| changed_by    | varchar(30) | YES  |     | NULL              |                             | 
| changed_on    | timestamp   | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+---------------+-------------+------+-----+-------------------+-----------------------------+

编辑 3:表中的示例条目

+----+---------------+------------+------------------+----------------------+---------------------+
| id | source_table  | foreign_id | field_changed    | changed_by           | changed_on          |
+----+---------------+------------+------------------+----------------------+---------------------+
| 0  | phone_numbers | 34         | home_phone       | jeff@localhost       | 2013-04-10 14:15:13 |
| 1  | contact_info  | 24         | first_name       | bob@localhost        | 2013-04-11 10:18:43 | 
| 2  | addresses     | 32         | home_address     | autoscript@localhost | 2013-04-12 11:10:37 |
| 3  | addresses     | 36         | business_address | bob@localhost        | 2013-04-12 14:56:17 |
| 4  | addresses     | 36         | business_address | jeff@localhost       | 2013-04-12 15:25:52 |
+----+---------------+------------+------------------+----------------------+---------------------+
4

2 回答 2

12

好的,这通常不是创建审计表的方式。通常,当您想要记录插入、删除和更新时,您会执行以下操作:

创建一个像 foo 这样的表:

create table foo (
    foo_id int not null auto_increment primary key,
    foo_data varchar(100) not null
    );

然后你通常会像这样制作一个审计表:

create table foo_audit (
    foo_audit_id not null auto_increment primary key,
    foo_id int,
    foo_data varchar(100),
    change_type char(1),
    change_timestamp timestamp default current_timestamp,
    change_login varchar(100)
    );

然后你在表上创建一个或多个触发器,如下所示:

create trigger trg_foo_insert
    after insert on foo
    for each row 
    insert into foo_audit (
        foo_id,
        foo_data,
        change_type,
        change_login
        )
    values (
        new.foo_id,
        new.foo_data,
        'I',
        current_user
        );

您将为更新创建一个“U”触发器,为删除创建一个“D”触发器。

我认为你遇到的主要问题是你试图做一个“一刀切”的审计表;我认为这种模式会给你带来很多问题,你不一定有你正在寻找的数据,你仍然需要为你正在审计的每个表编写至少一个触发器。

但是,您的问题的实际答案是,您要么在未插入的表上设置触发器,要么尝试更新该列不存在的表上的列。

于 2013-04-12T20:05:52.550 回答
0

我们可以在任何具有默认约束的表中添加列名作为系统用户。
在这里,我将在表格中添加 ModifiedBy 列。

ALTER TABLE [AccessDB].[dbo].[MediaTable]
ADD ModifiedBY varchar(100) default  SUSER_SNAME()
于 2019-10-30T08:39:48.107 回答