2011-05-10 124 views
0

我想实现的是我有一个表,称为订单。 我想在我的订单table.i上执行之前的插入触发器,我想捕获执行INSERT的人的 用户名到表中。 一张表包含用户的信息。我想执行之前的插入触发器,但我得到的SQL错误

这是我的代码

create table orders 
(
    order_id int, 
    quantity int, 
    cost int, 
    total_cost int, 
    created_date datetime, 
    created_by varchar(20) 
) 

create trigger beforeInsertdata 
before insert 
    on orders 
for each row 
    declare 
v_username varchar2(10); 
begin 
-- Find username of person performing INSERT into table 

    SELECT user INTO v_username 
    FROM info; 
-- Update create_date field to current system date 
    :new.create_date := sysdate; 
-- Update created_by field to the username of the person performing the INSERT 
    :new.created_by := v_username; 

END; 

--user information-- 
create table info 
(
    userid int , 
    user_name varchar(10) 
) 

insert into info values(1,'vivek') 
select * from info 
+0

不能*执行*或*执行*触发 - SQL Server将自动做到这一点,适当 – 2011-05-10 06:28:09

+0

时,这不是有效的SQL Server/T-SQL语法:'每个row'以及:' :new.create_date:= sysdate;' – 2011-05-10 06:28:47

+1

现在只有我得到了答案,因为SQL服务器不支持之前的插入触发器,它只支持after,而不是trigger.i认为只有在插入trigger.sory之前oracle支持这个为此---- – 2011-05-10 06:43:03

回答

3

基本上,触发器被分为两种主要类型: -

1)之后触发(对于触发器)

2),而不是触发器

和触发语法是

CREATE TRIGGER trigger_name ON table_name 
    [FOR|AFTER|INSTEAD OF] [INSERT|UPDATE|DELETE] 

    AS 

    //your code goes here 

    GO 

注意:FOR关键字用于INSERT | UPDATE命令,其中用作DELETE命令后使用。

+0

谢谢你的回答,现在只有我得到了答案,因为SQL服务器不支持之前的插入触发器,它只支持after,而不是trigger.i认为只有在插入trigger.sory之前,oracle支持此---- – 2011-05-10 12:25:27

0

很难说出你真正想要做什么。我已经修改了你的代码示例,以便它可以在SQL2K5上工作,并且假设你想要使用连接的用户帐户。

CREATE TABLE orders (
    order_id int, 
    quantity int, 
    cost int, 
    total_cost int, 
    created_date datetime, 
    created_by varchar(20) 
); 

CREATE TABLE info (
    userid int, 
    user_name varchar(10) 
); 

INSERT INTO info 
VALUES (1, 'vivek'); 

SELECT * 
FROM info; 

CREATE TRIGGER orders_InsteadOfInsert ON orders 
INSTEAD OF INSERT AS BEGIN 
    SET NOCOUNT ON; 

    -- varchar(10) is to match your table, but probably should be larger 
    DECLARE @CurrentUser VarChar(10); 
    SELECT @CurrentUser = SYSTEM_USER; 

    IF (@CurrentUser NOT IN (SELECT user_name FROM info)) BEGIN 
    -- consider using an identity column for the key instead of this 
    INSERT INTO info (userid, user_name) 
    SELECT 
     ISNULL((SELECT MAX(userid) FROM info), 0) + 1, 
     @CurrentUser; 
    END; 

    INSERT INTO orders (order_id, quantity, cost, total_cost, created_date, created_by) 
    SELECT 
    INS.order_id, 
    INS.quantity, 
    INS.cost, 
    INS.total_cost, 
    GETDATE(), 
    @CurrentUser 
    FROM INSERTED INS; 
END; 
+0

感谢您的回答,但现在只有我得到了答案,因为SQL服务器不支持之前插入触发器,它只支持后,而不是trigger.i认为只有在插入trigger.sory之前,oracle支持此--- --- - – 2011-05-10 12:24:55

+0

对,SQL Server不支持BEFORE触发器。不过,你可以用INSTEAD OF以类似的方式工作。 INSTEAD OF触发器取代了INSERT操作。这意味着如果你不在触发器内执行INSERT,它就不会发生。例如,如果连接的用户不在您的信息表中,那么您可以中止INSERT。希望这有助于......我认为这是一个语义问题,因为你试图使用它。 – Yuck 2011-05-10 12:26:59

+0

是的,我已经尝试过,我得到了答案。感谢您的建议 – 2011-05-10 12:40:02