الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اريد عمل Trigger يحل مشكلة ID بعد insert & delete

مغلق
بدأه Mahmoud_Kamel في 23 سبتمبر 2004 · 8 رد · 3,379 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله ,

عندى جدول اسمه Empoloyee وهذاا الجدول به 10 موظفين لهم ID من 1 الى 10

والمشكلة هى:

لو حذفت موظف رقم 5

ثم بعد ذلك ان اضيف موظف اخر واعتقد سيكون رقمه 11

ولكن اعتقد انه من الافضل ان نجعل رقمه يساوى اخر رقم محذوف = 5

فهل مثلا يمكن عمل trigger يقوم تلقائيا بجعل رقم الموظف المضاف يساوى رقم اخر موظف تم حذفه ان وجد موظف محذوف سابقا

اريد حل هذه المشكلة سريعا لانى لا اعرف الا بدايات T-Sql

ولكم منى جزيل الحب والاحترام

#2

هل يهمك تسلسل أرقام الموظفين بصورة كبيرة؟ أعني هل تحتاج لإعطائهم هذه الأرقام ، أم تستخدمها فقط في الربط بين الجداول؟

إذا كان كذلك، إذا لم تكن تستخدم الخاصية Identity، فيمكنك استرجاع كل السجلات ، ومن ثم البحث عن أي تسلسل أرقام مفقود، وإذا وجد، يتم إيقاف البحث وإعطاء الموظف هذا الرقم. مثلا: بجملة SQL:

select empno from Employees

وفي البرنامج:

dim i as integer=1
dim empty_no as integer
rs=cn.execute()
rs.movefirst()
do while not rs.EOF
   if rs!empno >i then 
       empty_no =i
       exit do
   else
      i+=1
     rs.MoveNext()
loop

ومن ثم تخزين الموظف الجديد بالرقم المخزن في المتغير empty_no .

أما إذا كانت الخاصية identity تعمل فستحتاج لإيقافها من الكود بأمر لا أذكره الآن، لأنها لن تسمح لك بتعديل قيمة الحقل ، و من ثم تطبيق الخطوات السابقة.

وبالتوفيق بإذن الله.

فكر بطريقة أخرى

#3
اقتباس
كانت الخاصية identity تعمل فستحتاج لإيقافها من الكود بأمر لا أذكره الآن

معذرة يا وليد و لكن هل لك ان تتأكد لان ال T-SQL لا تسمح بعملية تغيير او حذف اى حقل له الخاصية Identity

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#4
اقتباس
تتأكد لان ال T-SQL لا تسمح بعملية تغيير او حذف اى حقل له الخاصية Identity

فعلا لا تسمح

ولكن إذا أوقفت هذه الخاصية، فيمكن عمل أي عملية ممكنة على هذا الحقل.

فكر بطريقة أخرى

#5

لا يمكن إيقاف تلك الخاصية إلا من خلال ال EM و ليس من خلال ال T-SQL

فهل هناك طريقة للالتفاف حول هذا الموضوع

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#6
اقتباس
لا يمكن إيقاف تلك الخاصية إلا من خلال ال EM و ليس من خلال ال T-SQL

فهل هناك طريقة للالتفاف حول هذا الموضوع

يمكن إيقافها من QA بتعديل الخيار IDENTITY_INSERT ليسمح بإدخال قيم في حقل له الخاصية identity ، وذلك عبر الجملة التالية:

SET IDENTITY_INSERT myTableName ON

وبذلك يمكن تنفيذ الجملة التالية:

insert into myTableName (id, Name) values(5, 'walcom')

ولمنع إدخال قيم في حقل له الخاصية identity، عدل الخيار IDENTITY_INSERT ليمنع ذلك عبر الجملة التالية:

SET IDENTITY_INSERT myTableName OFF

وبالتالي لن تنفذ هذه الجملة:

insert into myTableName (id, Name) values(5, 'walcom')

مع مراعاة الUniqueness Constraint للحقل الذي يحمل الخاصية Identity والذي عادة ما يكون مفتاحا أساسيا للجدول.

فكر بطريقة أخرى

#7
اقتباس
لان ال T-SQL لا تسمح بعملية تغيير او حذف اى حقل له الخاصية Identity

كما تسمح أيضا بتصفير حقل الidentity أو جعله يبدأ من قيمة معينة بواسطة الأمر:

DBCC CHECKIDENT (table_name, RESEED, new_seed_value)

حيث table_name هو اسم الجدول المراد تغيير قيمة حقل الidentity له

new_seed_value القيمة الجديدة، ليبدأ الidentity من new_seed_value+1

مثلا عند إعطاء new_seed_value القيمة 0 سيحمل حقل الidentity لأول سجل يدخل القيمة 1، وهكذا.

ولمعرفة آخر قيمة لحقل الidentity:

DBCC CHECKIDENT (table_name, NORESEED)

تكتب هذه الأوامر في الcommand prompt عبر الأداة OSQL

فكر بطريقة أخرى

#8

أنا لا أنصحك بإعادة استخدام رقم كان لغير سجل

سلام

#9

السلام عليكم

المشكله دي ليها حل في الonline books

وأنا استخدمته و شغال تمام

الكود

-- Here is the generic syntax for finding identity value gaps in data.

-- The illustrative example starts here.

SET IDENTITY_INSERT tablename ON DECLARE @minidentval column_type
DECLARE @maxidentval column_type
DECLARE @nextidentval column_type
SELECT @minidentval = MIN($IDENTITY), @maxidentval = MAX($IDENTITY)
    FROM tablename IF @minidentval = IDENT_SEED('tablename')
   SELECT @nextidentval = MIN($IDENTITY) + IDENT_INCR('tablename')
   FROM tablename t1
   WHERE $IDENTITY BETWEEN IDENT_SEED('tablename') AND @maxidentval AND NOT EXISTS (SELECT * FROM tablename t2
         WHERE t2.$IDENTITY = t1.$IDENTITY + 
            IDENT_INCR('tablename'))
ELSE
   SELECT @nextidentval = IDENT_SEED('tablename')
SET IDENTITY_INSERT tablename OFF


-- Here is an example to find gaps in the actual data.
-- The table is called img and has two columns: the first column 
-- called id_num, which is an increasing identification number, and the 
-- second column called company_name.
-- This is the end of the illustration example.

-- Create the img table.
-- If the img table already exists, drop it.
-- Create the img table.


IF OBJECT_ID ('dbo.img', 'U') IS NOT NULL
   DROP TABLE img
GO
CREATE TABLE img (id_num int IDENTITY(1,1), company_name sysname)
INSERT img(company_name) VALUES ('New Moon Books')
INSERT img(company_name) VALUES ('Lucerne Publishing')
-- SET IDENTITY_INSERT ON and use in img table.
SET IDENTITY_INSERT img ON DECLARE @minidentval smallint
DECLARE @nextidentval smallint
SELECT @minidentval = MIN($IDENTITY) FROM img IF @minidentval = IDENT_SEED('img')
    SELECT @nextidentval = MIN($IDENTITY) + IDENT_INCR('img')
    FROM img t1
    WHERE $IDENTITY BETWEEN IDENT_SEED('img') AND 32766 AND NOT    EXISTS (SELECT * FROM img t2
          WHERE t2.$IDENTITY = t1.$IDENTITY + IDENT_INCR('img'))
 ELSE
    SELECT @nextidentval = IDENT_SEED('img')
SET IDENTITY_INSERT img OFF

مش عارف لما نسخته بقي شكله غلط

المهم ابحث في الonline books عن كلمه identity وهتلقيها في ال examples

تم تعديل هذه المشاركة بواسطة walcom في 7 يونيو 2006 في 09:25

هذا الموضوع مغلق.

مواضيع مشابهة