PDA

View Full Version : اموزش:ایجاد تریگرها و مثالهای مختلف



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

oliya24
یک شنبه 14 فروردین 1390, 00:53 صبح
این هم یه تریگر دیگه واسه شما دوستان عزیز و گرامی فقط شما هم همکاری کنید و مطلبی یا مثالی در این مورد جور کنید و در این تاپیک بگذارین به هر حال هم بدرد من میخوره و هم به درد شما به خدا من هم مثل خیلیها تازه کارم ????????????????????????????
این تریگر بعد از اضافه شدن رکورد در جدول فعال میشود
CREATE TRIGGER BEB
ON ABC
FOR INSERT
AS
PRINT 'ECORD INSERT'

حال پس از اجرای دستورات این دستور را اجرا کنید
INSERT INTO ABCVALUES('BENYAMIN')
در این مثال از جدولی به نام ABC استفاده شده که یک فیلد نام فقط دارد
دوستان شما هم کمک کنید دیگه

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

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

DELETEFROM ABC
WHERE PID='22'

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

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

karimi.ali2005
چهارشنبه 17 فروردین 1390, 11:22 صبح
اگر این تریگر را روی 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
چهارشنبه 17 فروردین 1390, 11:28 صبح
سلام با با شما بروبچه ها خیلی با حالید من این همه التماس کردم شما هم یه نیمچه شرکتی کنید والا به خدا ضرر نمیکنید بگذریم بازم اومدم تا یه مثال دیگه براتون بزنم
فرض کنید بخواهیم در جدولی که مخصوص دانشجویان است تریگری بنویسیم که پس از (دقت کنید پس از ) اضافه کردن رکوردی تعداد دانشجویان را بر گرداند
CREATE TRIGGER TGST
ON STUDENT
AFFTER INSERT
AS
SELECT COUNT (STDNO) FROM STUDENT

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

oliya24
چهارشنبه 17 فروردین 1390, 14:38 عصر
ددستور rollback چه کاری رو انجام میده لطفا توضیح دهید

karimi.ali2005
چهارشنبه 17 فروردین 1390, 14:56 عصر
یعنی هر عملی که انجام دادیم CREATE,Dropو... را لغو میکند
مثل کد زیر که مانع update,delete در جدول می شود


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

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

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

oliya24
چهارشنبه 17 فروردین 1390, 17:54 عصر
و برای فعال کردن تریگر مربوطه از فرمان زیر در همان جدول مربوطه استفاده میکنیم بدین نحو که:
enable trigger my_trigger on bv
go

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

karimi.ali2005
چهارشنبه 17 فروردین 1390, 18:04 عصر
یعنی هر عملی که انجام دادیم CREATE,Dropو... را لغو میکند
مثل کد زیر که مانع update,delete در جدول می شود


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

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

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

oliya24
چهارشنبه 17 فروردین 1390, 18:07 عصر
بار دیگر برای یاد اوری خودم هم که شده باشه تاکیید میکنم که تریگر 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
چهارشنبه 17 فروردین 1390, 18:10 عصر
فعال کردن وغیر فعال کردن تریگرهای یک جدول
فعال کردن


ALTER TABLE name_table Enable TRIGGER all

غیر فعال


ALTER TABLE name_table Disable TRIGGER all

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

oliya24
چهارشنبه 17 فروردین 1390, 18:42 عصر
دوستان برای حذف تریگر از دستور drop trigger استفاده کنید بدین نحو
drop trigger my _ trigger

oliya24
چهارشنبه 17 فروردین 1390, 18:46 عصر
و اما برای مشاهده تمام تریگر هایی که تا به حال نوشته اید از این رویه ذخیره شده استفاده کنید

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

mialdf
پنج شنبه 18 فروردین 1390, 13:16 عصر
سلام دوستان گرامی
من 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
جمعه 19 فروردین 1390, 10:25 صبح
سه حالت برای جدول اتفاق می افتد(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
جمعه 19 فروردین 1390, 13:12 عصر
دوست گرامی کدها رو کپی وپیست نکن که این طور بشن این پست را ویرایش کن و کدها رو بنویس

karimi.ali2005
سه شنبه 27 اردیبهشت 1390, 21:23 عصر
و یک 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
چهارشنبه 23 آذر 1390, 06:56 صبح
با سلام و تشکر

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

zgh_zgh
شنبه 18 خرداد 1392, 11:00 صبح
برای مشاهده کدهای تریگر

sp_helptext @objname = 'trigger name'

/1tapc\
سه شنبه 09 اردیبهشت 1393, 15:56 عصر
یه نکته بگم برا دوستانی که از html سر در نمیارن برخی مثال ها به صورت کد html ذخیره شدن و قابل فهم نیست.
برای مشههده اونارو توی یه notepad ذخیره کنید و قبل از هر نوشته ای این کد را وارد کنید <html> و در پایان و اخر همه ی کد ها هم <html/> را وارد کنید . اونو با پسوند html ذخیره کنید و بعد با یه مرورگر باز کنید تا مثال را ببینید!

hassanzarabi
دوشنبه 03 خرداد 1395, 06:39 صبح
با سلام و خسته نباشید

برای من خیلی مفید بود دست شما درد نکنه جناب آقای oliya24 (http://barnamenevis.org/member.php?160612-oliya24)