ورود

View Full Version : INSERT در VIEW



dr_csharp
سه شنبه 27 آذر 1386, 09:47 صبح
سلام .
دوستان من یک View دارم که تلفیقی از دو جدول A و B است .
جدول A دارای فیلدهای CompanyID بعنوان PK و CompanyName میباشد .
جدول B دارای فیلدهای CompanyID بعنوان FK و Telephone میباشد .
واضحه که یک Company میتونه چندتا Telephone داشته باشه بنابراین یک رابطه ی یک به چند داریم.من میخوام وقتی کاربر CompanyName وارد میکنه همزمان قادر به وارد نمودن Telephone برای اون Company باشه .
دوستان پیشنهاد داده بودن اینکار با View انجام بشه و یک Trigger روی View تعریف بشه که وقتی در جدول CompanyName ، A رو وارد میکنه همون موقع CompanyID رو بگیره و در جدول B ، تلفن های مربوط به اون CompanyID رو هم وارد کنه .
ممنون میشم اگر نسبت به پیاده سازی این طرح راهنماییم کنید .میخوام بدونم View من چه فیلدهایی باید داشته باشه ، Trigger رو چطور بنویسم و بحث INSERT کجا انجام میشه ؟

مثلا کد زیر رو در نظر بگیرید :

declare @Id int
INSERT INTO A (CompanyName)VALUES('Iran');
SELECT @Id=@@IDENTITY
INSERT INTO B (CompanyID,Tel)VALUES(@Id,'0912')

خوب حالا این میتونه یه StoredProcedure باشه که دوتا پارامتر بگیره ( نام شرکت و شماره تلفن ) و نیازی به View و تریگر و ... نداره . ممنون میشم راهنمایی کنید

mehdia86
سه شنبه 27 آذر 1386, 10:54 صبح
با سلام .
برای اینکار در فرم برنامه با بصورت Master/Detail کار کنی جواب می ده ولی با استفاده از SP بطوریکه هر company که در Master وجود داره یا اضافه می شه شما لیست تلفنهاش رو در Detail نشون بدی که اینم فقط احتیاج به SP ساده داره

Select CompanyId,Telephone
From TelList
Where CompanyId=@CompanyId


در این حالت با Scrol در اطلاعات Master (لیست شرکتها) باید این SP رو مجدد فراخوانی کنی تا لیست تلفنهای شرکت جاری رو نمایش بده و امکان ویرایش و اضافه نمودن به انها هم وجود داره.
البته در قسمت Detail شما فقط فیلد Telephone رو به کاربر نمایش می دی و هنگام اضافه کردن خودتون قیلد کلید خارجی CompanyId رو با توجه به کلید اصلی اصلاعات شرکت(Master) بروزرسانی می کنی

در خصوص روشی هم که توضیح دادین با ویو با این توضیحات فکر کنم عملی نیست آخه هنگام اجرای تریگر در جدول Company شماره تلفنها وجود ندارند چون جزو فیلدهای اون نیستند.

موفق باشید

JAFO_IRAN
سه شنبه 27 آذر 1386, 13:34 عصر
سلام

همانطور که قبلا هم عرض شد، استفاده از view تنها راه نیست و شاید برای کاربرد شما هم مناسب نباشد - من فقط گفتم "اگر بخواهید حاصل از دید سایر بخش‌ها - مثلا ADO - یک جدول دیده بشه" استفاده از view میتونه کمک کنه...

به هر حال آشنایی با اون و با همین مثالی که زدید حداقل دید بهتری در مورد امکانات موجود بدست میده - اما اصلا منظور این نیست که تنها راه حل (یا حتی راه حله):



CREATE VIEW dbo.nv_AB
AS
SELECT
fld_CompanyID = A.CompanyID,
fld_CompanyName = A.CompanyName,
fld_PhoneNum = B.Telephone
from A inner join B on A.CompanyID = B.CompanyID
GO

CREATE TRIGGER [del_nv_AB] ON [dbo].[nv_AB]
instead of DELETE
AS
-- if the PK-FK rel does not Cascade Delets:
delete B from B inner join deleted d on (B.CompanyID = d.fld_CompanyID) and (B.Telephone = d.fld_PhoneNum)

-- always:
delete A from A inner join deleted d on A.CompanyID = d.fld_CompanyID
GO

CREATE TRIGGER [upd_nv_AB] ON [dbo].[nv_AB]
instead of UPDATE
AS
if update(fld_ComanyID)
begin
RaisError('Sys Error: CompanyID is Read Only (nv_AB)', 16, 1)
RollBack Transaction
return
end

update A set CompanyName = fld_CompanyName
from A inner join inserted on CompanyID = fld_CompanyID

update B set Telephone = fld_PhoneNum
from B inner join inserted on CompanyID = fld_CompanyID
GO
CREATE TRIGGER [ins_nv_AB] ON [dbo].[nv_AB]
instead of INSERT
AS
declare @AnID int, @AName nvarchar(255), @APhoneNum nvarchar(255)

declare ACursor cursor local for
select fld_CompanyName, fld_PhoneNum from inserted

open ACursor

Fetch next from ACursor into @AName, @APhoneNum

while @@Fetch_Status <> -1
begin
if @@Fetch_Status <> -2
begin
insert A (CompanyName) values (@AName)
select @AnID = @@IDENTITY
insert B (CompanyID, Telephone) values (@AnID, @APhoneNum)
end
Fetch next from ACursor into @AName, @APhoneNum
end

close ACursor
deallocate ACursor


ارادت