# پایگاه‌های داده > SQL Server > T-SQL >  اموزش:ایجاد تریگرها و مثالهای مختلف

## oliya24

سلام دوستان قصدم از زدن این تاپیک این بود که هم خودم وهم شما یه سری مطلب(که با کمک شما دوستان باید تکمیل بشه بود) پس همه با هم شروع میکنیم
تریگر چیست؟؟؟؟؟؟؟؟؟؟؟
تریگر در واقع مثل یه رویداد میمونه که برای یک جدول مینویسیم که اگر یکی از اعمال Delete یا Insert یا update روی جدول مورد نظر اتفاق افتاد ،این رویداد اجرا بشه.
مثلا برای یک جدول یک تریگر مینویسید که اگر عمل insert روی جدول اتفاق افتاد تعداد رکوردها رو برگردونه و یا ... 
به طور پیش فرض کلیه تریگرهای جدول پس از تغییرات جدول فعال میشوند این تریگرها AFTER نام دارند 
تریگرهای دیگری نیز وجود دارند که INSTED OF نامیده میشوند و به جای تغییر در دادههای مورد نظر این تریگر فعال میشود 
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
برای ایجاد تریگر 2 راه وجود داره 1: از طریق کدنویسی در اس کیوال سرور 
2:از طریق خود نرم افزار اس کیوال سرور
که ما قصد داریم روش اول یعنی کد نویسی رو با هم کار کنیم
برای ساخت تریگر از دستور CREATE TRIGGER  
استفاده میشود
برای اولین مثال ما میخواهیم تریگری بر روی یک جدول ایجاد کنیم که در هنگام حذف اطلاعات از یه جدول به نام NBH این تریگر فعال شود
CREATE TRIGGER BENYAMIN 
ON NBH 
FOR DELETE AS 
RAISERRORPRINT'DELETE'

----------


## oliya24

این هم یه تریگر دیگه واسه شما دوستان عزیز و گرامی فقط شما هم همکاری کنید و مطلبی  یا مثالی در این مورد جور کنید و در این تاپیک بگذارین به هر حال هم بدرد من میخوره و هم به درد شما به خدا من هم مثل خیلیها تازه کارم ????????????????????????????
این تریگر بعد از اضافه شدن رکورد در جدول فعال میشود 
CREATE TRIGGER BEB
ON ABC 
FOR INSERT 
AS 
PRINT 'ECORD INSERT'
       
حال پس از اجرای دستورات این دستور را اجرا کنید 
  INSERT INTO ABCVALUES('BENYAMIN')    
در این مثال از جدولی به نام ABC استفاده شده که یک فیلد نام فقط دارد 
دوستان شما هم کمک کنید دیگه

----------


## oliya24

تریگرهای INSTAED OF : هنگام استفاده از این نوع تریگرها 'به جای دستورات کاربر دستورات تریگر اجرا میشوند به عنوان مثال فرض کنید تریگری برای یکی از جداولتان مینویسید تا به کار بر اطلاع دهد که نمیتواند در این جدولی رکوردی را حذف یا مثلا اضافه کند و.. این کار با استفاده از تریگر INSTEAD OF قابل اجرا است 
حال بریم یه مثالی بزنیم : 
CREATETRIGGER RT 
ON ABC
INSTEAD OF DELETE AS
PRINT'CAN NOT DELETE '

حال بیایید و این دستور رو اجرا کنید مشاهده خواهید کرد که اون رکورد مورد نظر حذف نمیشود دوستان من خودم هم دارم تمرین میکنم و نتیجه کار رو برای شما مینویسم این یعنی که این مثالها درست هستن 

DELETEFROM ABC 
WHERE PID='22'

دوستان عزیز خواهشا شما هم یه لطفی کنید و مثالی مطلبی رو در مورد این مبحث اینجا بگذارید

----------


## oliya24

سلام با با شما بروبچه ها خیلی با حالید من این همه التماس کردم شما هم یه نیمچه شرکتی کنید والا به خدا ضرر نمیکنید  بگذریم بازم اومدم تا یه مثال دیگه براتون بزنم
فرض کنید بخواهیم در جدولی که مخصوص دانشجویان است تریگری بنویسیم که پس از (دقت کنید پس از ) اضافه کردن رکوردی تعداد دانشجویان را بر گرداند
 CREATE TRIGGER TGST 
ON STUDENT 
AFFTER INSERT  
AS
SELECT COUNT (STDNO) FROM STUDENT

----------


## karimi.ali2005

اگر این تریگر را روی database بنویسید دیگه نمیشه تغییراتی داخل database انجام داد

CREATE TRIGGER TRIGGER_DROPTABLE 
ON DATABASE 
FOR DROP_TABLE,CREATE_TABLE,ALTER_TABLE,CREATE_PROCEDU  RE, ALTER_PROCEDURE, DROP_PROCEDURE,DROP_TRIGGER,CREATE_TRIGGER,ALTER_T  RIGGER,DROP_VIEW,CREATE_VIEW,ALTER_VIEW
AS 
   PRINT 'شما نمی توانید تغييراتي در پایگاه ايجاد کنيد' 
   ROLLBACK

----------


## karimi.ali2005

> سلام با با شما بروبچه ها خیلی با حالید من این همه التماس کردم شما هم یه نیمچه شرکتی کنید والا به خدا ضرر نمیکنید بگذریم بازم اومدم تا یه مثال دیگه براتون بزنم
> فرض کنید بخواهیم در جدولی که مخصوص دانشجویان است تریگری بنویسیم که پس از (دقت کنید پس از ) اضافه کردن رکوردی تعداد دانشجویان را بر گرداند
>  CREATE TRIGGER TGST 
> ON STUDENT 
> AFFTER INSERT 
> AS
> SELECT COUNT (STDNO) FROM STUDENT


با توجه به گفته شما میخوام ببینم مقدار بازگشتی این trigger را می توان داخل برنامه استفاده کرد یعنی مثلا داخل یک متغیر داخل برنامه ریخت

----------


## oliya24

ددستور rollback چه کاری رو انجام میده لطفا توضیح دهید

----------


## karimi.ali2005

یعنی هر عملی که انجام دادیم CREATE,Dropو... را لغو میکند
مثل کد زیر که مانع update,delete در جدول می شود

create trigger MyTrigger
on table1
WITH ENCRYPTION
instead of update,delete  
as 
begin 
 Print 'این جدول غیر قابل تغییر است'
ROLLBACK
end

----------


## oliya24

با تشکر از دوست عزیز مان که ما را در مطالب این تاپیک کمک میکنه من تازه در book online بودم و به دو مورد به نامهای فعال کردن وغیر فعال کردن تریگرها برخورد کردم :خودمونیم شاید یه وقتی نخواستیم برای یک لحظه از تریگر بکار برده شده استفاده کنیم پس دستور 

غیر فعال کردن تریگر را بدین شکل مینویسیم من بر روی جدولی به نام bv تست کردم و درست هم بود پس بریم :
disable trigger my_trigger 
on bv 
go

----------


## oliya24

و برای فعال کردن تریگر مربوطه از فرمان زیر در همان جدول مربوطه استفاده میکنیم بدین نحو که:
enable trigger my_trigger on bv 
go

دوستان یک نفر به جمع ما اضافه شده و ما رو همیاری میکنه پس لطفا شما هم ما رو در این تاپیک همراهی کنید به خدا جالب تر از این هم میشه
با تشکر

----------


## karimi.ali2005

> یعنی هر عملی که انجام دادیم CREATE,Dropو... را لغو میکند
> مثل کد زیر که مانع update,delete در جدول می شود
> 
> create trigger MyTrigger
> on table1
> WITH ENCRYPTION
> instead of update,delete 
> as 
> begin 
> ...


نکته ای که دراین تریگر فراموش کردم بگم استفاده از WITH ENCRYPTION که سبب میشه کد تریگر غیر قابل دسترس باشه

یک سوال :آیا روشی وجود داره که بتوان کد را برگرداند؟؟؟ :متفکر:

----------


## oliya24

بار دیگر برای یاد اوری خودم هم که شده باشه تاکیید میکنم که تریگر instead of به جای دستورات کاربر استفاده میشود مثلا فرض کنید که شما تریگری مینویسید که از حذف رکورد در جدول شما جلوگیری کند و یه پیغامی رو به کاربر نشان دهد  خوب حالا اون رو اجرا میکنید و کاربر میاد و یه رکورد رو میخواد حذف کنه که ناگهان با اون پیامی که در تریگر نوشتید مواجه میشه پس نتیجه میگیریم که این نوع تریگر به جای دستوررات کاربر اجرا میشود دوباره مثالی ذکر میکنم :
create trigger my_trigger 
on bv 
instead of delete as 
print ('can not delete recods from bv table')

حال پس از اجرای این دستورات بیایید و این  دستورات رو اجرا کنید
delete from bv

----------


## karimi.ali2005

فعال کردن وغیر فعال کردن تریگرهای یک جدول
فعال کردن

ALTER TABLE name_table Enable TRIGGER all

غیر فعال

ALTER TABLE name_table Disable TRIGGER all

----------


## oliya24

اگر این دستورات رو اجرا کنید پیغامی چاپ میشه که شما نمیتوانید این کار رو انجام بدید  حالا ما میخواهیم دستور تغییر تریگر ایجاد شده رو هم در این تاپیک شرح بدیم دوستان مثال بالا رو طوری تغیر میدهیم که به راحتی اب خوردن بتوانید رکورد های جدول مورد نظر تان رو حذف کنید پس :
alter trigger my_trigger 
on bv
for delete as 
print ('%d delete records')

----------


## oliya24

دوستان برای حذف تریگر از دستور drop trigger  استفاده کنید بدین نحو
drop trigger my _ trigger

----------


## oliya24

و اما برای مشاهده تمام تریگر هایی که تا به حال نوشته اید از این رویه ذخیره شده استفاده کنید

sp_helptrigger 'bv'
با اجرای این دستور لیست تریگرهای مربوط به جدول BV  را مشاهده میکنید 
دوستان بیایید و به جمع ما بپیوندین

----------


## mialdf

سلام دوستان گرامی
من 2 تا جدول دارم یکی به نام kar با فیلد های IDP,Na,Fa,Te,Ad و جدول دوم به نام Mos با فیلد های ID,IDP,Na,Fa  
میخوام وقتی کاربر تغییراتی در جدول kar  ایجاد میکنه مثلاً مقدار Na رو عوض میکنه به طبع این مقدار Na
 Na در جدول 2 هم اعمال بشه

نمیدونم ولی فکر کنم باید Trigger  بنویسم 
اگه باید تریگر بنویسم ممنون میشم کمکم کنید.
من از VS 2010 و بانک اطلاعاتی SQL  خود VS استفاده میکنم و از طریق DataSet  به برنامه ارتباط دارم.
ممنونم

----------


## karimi.ali2005

سه حالت برای جدول اتفاق می افتد(insert,update,delete)
درضمن ما دوتا جدول داریم که رکورهایی که حذف میشوند(deleted)ورکوردهایی که اضافه میشوند(inserted) در آن ها نگه داری میشوند

 
createtrigger t1
on kar
After update
as
begin
declare @d int
select @d=Na from deleted 
declare @i int
select @i=Na from inserted
if(@i is not null)and(@d is not null)
begin
-- update 
end
end

----------


## oliya24

دوست گرامی کدها رو کپی وپیست نکن که این طور بشن این پست را ویرایش کن و کدها رو بنویس

----------


## karimi.ali2005

و یک trigger جالب دیگه که ip و user و ... را برمی گرداند 

CREATE DATABASE AuditDB;
GO
USE AuditDB;
GO
CREATE TABLE dbo.DDLEvents
(
    EventDate    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    EventType    NVARCHAR(64),
    EventDDL     NVARCHAR(MAX),
    EventXML     XML,
    DatabaseName NVARCHAR(255),
    SchemaName   NVARCHAR(255),
    ObjectName   NVARCHAR(255),
    HostName     VARCHAR(64),
    IPAddress    VARCHAR(32),
    ProgramName  NVARCHAR(255),
    LoginName    NVARCHAR(255)
);
USE YourDatabase;
GO
CREATE TRIGGER DDLTriggerName
    ON DATABASE
    FOR CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE
        @EventData XML = EVENTDATA();
 
    DECLARE 
        @ip VARCHAR(32) =
        (
            SELECT client_net_address
                FROM sys.dm_exec_connections
                WHERE session_id = @@SPID
        );
 
    INSERT AuditDB.dbo.DDLEvents
    (
        EventType,
        EventDDL,
        EventXML,
        DatabaseName,
        SchemaName,
        ObjectName,
        HostName,
        IPAddress,
        ProgramName,
        LoginName
    )
    SELECT
        @EventData.value('(/EVENT_INSTANCE/EventType)[1]',   'NVARCHAR(100)'), 
        @EventData.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'NVARCHAR(MAX)'),
        @EventData,
        DB_NAME(),
        @EventData.value('(/EVENT_INSTANCE/SchemaName)[1]',  'NVARCHAR(255)'), 
        @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]',  'NVARCHAR(255)'),
        HOST_NAME(),
        @ip,
        PROGRAM_NAME(),
        SUSER_SNAME();
END
GO

----------


## mosafer_deltang

با سلام و تشکر

من تو جدولم یک فیلد به نام Allow_Delete دارم میخوام اگه مقدارش False بود اجازه ی حذف داد نشه وگرنه بتونه حذف کنه
ممنون میشم کمکم کنید.

----------


## zgh_zgh

برای مشاهده کدهای تریگر

*sp_helptext @objname = 'trigger name'*

----------


## /1tapc\

یه نکته بگم برا دوستانی که از html سر در نمیارن برخی مثال ها به صورت کد html ذخیره شدن و قابل فهم نیست.
برای مشههده اونارو توی یه notepad ذخیره کنید و قبل از هر نوشته ای این کد را وارد کنید <html> و در پایان و اخر همه ی کد ها هم <html/> را وارد کنید . اونو با پسوند html ذخیره کنید و بعد با یه مرورگر باز کنید تا مثال را ببینید!

----------


## hassanzarabi

با سلام و خسته نباشید

برای من خیلی مفید بود دست شما درد نکنه جناب آقای *oliya24*

----------

