2011-05-10 127 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