12

I got lost when I wanted to create trigger using the pre-defined "CREATE TRIGGER" of SQL Server 2008 R2. Could you please give me a direct SQL statement that I can use to create a trigger, and tell me how to define AFTER, BEFORE, and all that?

Also, how can I know the rows UPDATED/INSERTED/DELETED, and use their column values to do operations inside the trigger?

3
  • @john: The product is called "SQL Server", not "MSSQL". "MSSQL" can be easily confused with "MySQL". Also, when asking a SQL Server question, I suggest you use the "sql-server" tag. "sql" is for general questions about the SQL language. Commented Jul 29, 2010 at 2:17
  • Ok thanks for the note. Will do that. Commented Jul 29, 2010 at 2:19
  • Is your question simply about how to define a trigger or is it how to write a trigger that you can use to operate on the affected rows? If the later, then you should consider rephrasing your question. Commented Jul 29, 2010 at 2:35

3 Answers 3

13

The basic syntax is

CREATE TRIGGER YourTriggerName ON dbo.YourTable
FOR|AFTER INSERT, UPDATE, DELETE
AS
BEGIN
     /*Put what ever you want here*/
     UPDATE AnotherTable
          SET SomeColumn = AnotherColumn
     FROM inserted | deleted
END
GO
Sign up to request clarification or add additional context in comments.

Comments

3

Databases are set-oriented and triggers are no different. A trigger will fire when a given operation is performed and that operation might affect multiple rows. Thus, the question "Say I want to know the Primary Key of that row" is a misnomer. There could be multiple rows inserted.

SQL Server provides two special tables for AFTER triggers named inserted and deleted which represent the rows that were inserted or deleted by an action and are structured identically to the table being affected. An update trigger might populate both inserted and deleted whereas an insert trigger would only populate the inserted table.

From comments:

but the email recipient will be decided based on a value in a second table, where the foreign key ID is located in the first table (which is the one with trigger

The answer to this question is to use the inserted table (which again, you must assume could have multiple rows) to cycle through the rows and send an email. However, I would recommend against putting email logic in a trigger. Instead, I would recommend putting that logic in a stored procedure and send your email from that.

For reference: Create Trigger

6 Comments

And then to call that procedure from the trigger? Is that what you mean? But isn't the sql mailing system procedure enough to handle that in the trigger? or should I create a procedure that calls that system procedure, and then call this procedure in the trigger?
@johnshaddad - No. I would not do email operations from a trigger. Instead, I would have your calling code use the stored proc instead of operating against the table directly.
When you said "There could be multiple rows inserted." doesn't that fire the trigger multiple times? Or how? Could you explain how I would loop in such a case?
@johnshaddad - A trigger fires once per statement or operation. For example, suppose you have a query Insert Table(...) Select ... From OtherTable that inserts 100 rows. The trigger will only fire once. The special inserted table will have 100 rows that you can cycle on using something like a cursor or can use in other SQL statements (e.g. Insert LogTable(...) Select ... From inserted).
@johnshaddad - Now, if instead of a single Insert Table(...) Select ... From OtherTable call, suppose you execute 100 Insert statement where you insert one row each time. Each statement will fire the trigger once and the inserted table will contain a single row each time it fires. However, when writing a trigger you must assume that someone could insert, update or delete to the table using a set operation which will affect multiple rows.
|
2

A trigger is an event-based process that is "triggered" after a table is changed in some way. This will be on DELETE, UPDATE, INSERT, and so forth. Your BEFORE and AFTER syntax will define whether to run the trigger before or after the event is committed.

That's the short version. Check out MSDN.

3 Comments

Yes, I am familiar with triggers on MySQL but not on MSSQL, so I thought there is a different way of implementation. Thanks!
But how can I know which row is being updated? Say I want to know the Primary Key of that row, how to do that? Something like to send an email after a new item is added, but the email recipient will be decided based on a value in a second table, where the foreign key ID is located in the first table (which is the one with trigger)
mrdenny's comment in reply to Joel Coehoorn's answer is a good summary.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.