اشياء لم يتم التطرق لها في قواعد بيانات فايربيرد
#1
السلام عليكم ورحمة الله


الدالة ROW_COUNT 

كود :
BEGIN
    SELECT COL FROM TAB INTO :VAR;

    IF (ROW_COUNT = 0) THEN
      EXCEPTION NO_DATA_FOUND;
  END

تعيد عدد الصفوف المتأثرة من جملة الاستعلام او الحذف او التعديل بمعنى العملية التي تم تنفيدها
مثال اخر

كود :
update Figures set Number = 0 where id = :id;
if (row_count = 0) then
  insert into Figures (id, Number) values (:id, 0);


المؤشرات Explicit Cursors

أصبح من الممكن الآن الإعلان عن مؤشرات متعددة واستخدامها في PSQL. تتوفر المؤشرات الصريحة في بنية DSQL EXECUTE BLOCK وكذلك في الإجراءات والمشغلات المخزنة.

كود :
DECLARE RNAME CHAR(31);
    DECLARE C CURSOR FOR ( SELECT RDB$RELATION_NAME
                              FROM RDB$RELATIONS );
    BEGIN
      OPEN C;
      WHILE (1 = 1) DO
      BEGIN
        FETCH C INTO :RNAME;
        IF (ROW_COUNT = 0) THEN
          LEAVE;
        SUSPEND;
      END
      CLOSE C;
    END


مثال اخر

كود :
DECLARE RNAME CHAR(31);
    DECLARE FNAME CHAR(31);
    DECLARE C CURSOR FOR ( SELECT RDB$FIELD_NAME
                           FROM RDB$RELATION_FIELDS
                           WHERE RDB$RELATION_NAME = :RNAME
                           ORDER BY RDB$FIELD_POSITION );
    BEGIN
      FOR
        SELECT RDB$RELATION_NAME
        FROM RDB$RELATIONS
        INTO :RNAME
      DO
      BEGIN
        OPEN C;
        FETCH C INTO :FNAME;
        CLOSE C;
        SUSPEND;
      END
    END

بالامكان الان اسناد القيم الافتراضية في الاجراءات المخزنة
Defaults for Stored Procedure Arguments


كود :
CREATE PROCEDURE P1 (X INTEGER = 123)
   RETURNS (Y INTEGER)
   AS
   BEGIN
     Y = X;
     SUSPEND;
   END

بالامكان استخدام العبارة LEAVE لانهاء حلقة تكرارية او الخروج من تنفيد اي عملية قائمة

كود :
FOR
     SELECT COALESCE(RDB$SYSTEM_FLAG, 0), RDB$RELATION_NAME
       FROM RDB$RELATIONS
       ORDER BY 1
     INTO :RTYPE, :RNAME
     DO
     BEGIN
       IF (RTYPE = 0) THEN
         SUSPEND;
       ELSE
         LEAVE; -- exits current loop
     END


كود :
CNT = 100;
   L1:
   WHILE (CNT >= 0) DO
   BEGIN
     IF (CNT < 50) THEN
       LEAVE L1; -- exists WHILE loop
     CNT = CNT - l;
   END

العبارة ROW_NUMBER

كود :
select
        id,
        salary,
        row_number() over (order by salary)
      from employee
      order by salary;

تعطي رقم متسلسل للصفوف وتعمل مع عبارة Over التجميعية بما ياتي معها من صيغ مختلفة حسب الطلب

العبارة RANK

كود :
select
        id,
        salary,
        rank() over (order by salary)
      from employee
      order by salary;

مثل السابقة ولكن تكرر الترقيم بحال كان مكرر لاحظ النتيجة

كود :
rank salary id
      -- ------ ----
       3  8.00     1
       4  9.00     2
       1 10.00     3
       5 10.00     3
       2 12.00     5

العبارة PERCENT_RANK

كود :
select
        id,
        salary,
        rank() over (order by salary),
        percent_rank() over (order by salary)
      from employee
      order by salary;

نفس السابقة وبنسب مئوية


العبارة  cume_dist

كود :
select
        id,
        salary,
        cume_dist() over (order by salary)
      from employee
      order by salary;

كود :
       cume_dist salary id
      -- ------ ---------
       3   8.00       0.2
       4   9.00       0.4
       1  10.00       0.8
       5  10.00       0.8
       2  12.00         1


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

firebird.conf وايضا  databases.conf لان فايربيرد عند التثبيت يتم تثبيته باعدادت افتراضية تكون سيئة وغير مضبوطة لتناسب حجم العمل الذي تعمل عليه

كود :
https://cc.ib-aid.com/democalc.html

سوف تقوم الصفحة باعطاء قيم لاستخدام الرامات وقيم لحجم الصفحات لقاعدة البيانات وامور مهمة لذلك


هذه النصائح مجالات مختلفة، من تحسينات الأجهزة/نظام التشغيل وتهيئة Firebird إلى توصيات تحسين SQL.
أولاً: تحسينات الأجهزة/نظام التشغيل:
  1. استخدام SSD لقاعدة البيانات: نقل قاعدة البيانات إلى SSD سيُحسّن سرعة القراءة والكتابة بشكل كبير.
  2. استخدام RAID 10: إذا كنت تستخدم RAID 1 أو RAID 5، ففكر في استخدام RAID 10، فهو أسرع بنسبة 15-25%.
  3. التحقق من BBU: تأكد من أن بطارية BBU (بطارية احتياطية للذاكرة) في حالة جيدة.
  4. ضبط ذاكرة التخزين المؤقت للكتابة على "write-back": سيُحسّن هذا الأداء عند كتابة البيانات على القرص.
  5. تمكين ذاكرة التخزين المؤقت للقراءة: سيُحسّن هذا الأداء عند قراءة البيانات من القرص.
  6. التحقق من نظام القرص الفرعي: تأكد من أن نظام القرص الفرعي يعمل بشكل صحيح.
  7. استخدام مساحة مؤقتة سريعة: خصص مساحة مؤقتة سريعة (SSD أو محرك RAM) لعمليات الفرز الكبيرة.
ثانياً: تحسينات تهيئة Firebird:
  1. استخدام SuperClassic أو Classic في Firebird 2.5: يُقدم SuperClassic أداءً أفضل للعمليات المتزامنة، بينما يُقدم Classic أداءً أفضل للعمليات المتسلسلة.
  2. استخدام SuperServer 3.0 في Firebird 3: يُقدم SuperServer 3.0 أداءً أفضل للعمليات المتزامنة والمتسلسلة.
  3. ضبط عدد صفحات ذاكرة التخزين المؤقت: اضبط عدد صفحات ذاكرة التخزين المؤقت وفقًا لحجم قاعدة البيانات وحجمها.
  4. ضبط عدد الموصلات: اضبط عدد الموصلات وفقًا لعدد المستخدمين المتزامنين.
  5. ضبط حجم ذاكرة التخزين المؤقت للقراءة/الكتابة: اضبط حجم ذاكرة التخزين المؤقت للقراءة/الكتابة وفقًا لحجم قاعدة البيانات وحجمها.
  6. ضبط مسار الملف المؤقت: خصص مسارًا سريعًا للملفات المؤقتة.
  7. إلغاء تنشيط الميزات غير المستخدمة: قم بإلغاء تنشيط الميزات غير المستخدمة لتحسين الأداء.

والصفحة السابقة تقوم باعطاء اغلب الاعدادات المذكورة لتحسين اداء محرك فايربيرد

وعلى سبيل المثال اعدادات خاصة قدمها بحسب مواصفات معينة تتماشى مع المواصفات التي تم تقديمها فقام بالغاء اشياء وفعل اشياء وزاد او غير في اشياء
ومن تجربتي الخاصة استعلامات كانت تاخذ حوالي 350 ملي ثانية على مليون و500 الف سجل اصبحت تأخذ 128 ملي ثانية
بمعنى ان الاعدادات هذه لا تصلح لاي جهاز بالضرورة

اعدادات لملف ملف  firebird.conf

كود :
ServerMode = Super
DefaultDbCachePages = 50K # pages (SuperServer) - increase pages in databases.conf, not here


LockMemSize = 20M # bytes (SuperServer)
LockHashSlots = 40099 # slots

MaxUnflushedWrites = -1 # default for posix (non-Windows)
MaxUnflushedWriteTime = -1 # default for posix (non-Windows)
UseFileSystemCache = true
TempCacheLimit = 256M
RemoteServicePort = 3050
InlineSortThreshold = 16384 # use REFETCH plan for big sortings


ExtConnPoolSize = 64 # external connections pool size
ExtConnPoolLifeTime = 3600 # seconds

#set DataTypeCompatibility according Migration Guide https://ib-aid.com/download /docs/fb4migrationguide.html
#DataTypeCompatibility =
#WireCryptPlugin = ChaCha64, ChaCha, Arc4
#WireCrypt = Enabled (for client) / Required (for server)
#WireCompression = false
#RemoteAuxPort = 0
#authentication plugin setup
#Recommendation - use SELECT * FROM SEC$USERS
#to check that you have users for all plugins
AuthServer = Srp256, Legacy_Auth
UserManager = Srp, Legacy_UserManager

#MaxIdentifierByteLength = 252
#MaxIdentifierCharLength = 63
#DefaultTimeZone =
#SnapshotsMemSize = 64K # bytes
#TipCacheBlockSize = 4M # bytes

اعدادات ملف  databases.conf

كود :
security.db = $(dir_secDb)/security4.fdb
{
RemoteAccess = false
DefaultDbCachePages = 256
}
testdb = c:\temp\mydb1.fdb
{
DefaultDBCachePages = 115536
LockMemSize = 30M
TempCacheLimit  =2185M
}

كما تجدر الاشارة الى ان الاعدادات التي يتم تقديمها تقوم بتحسين اداء فايربيرد ولكن ليس بالضرورة ان يكون افضل ما يكون ولتحصل على افضل شئ تحتاج الى فهم عمل كل هذه الخيارات وتجرب بنفسك


وهناك اشياء اخرى جديدة واشياء قديمة ومهمة و الذي سوف اضيفه كلما سنحت الفرصة لذلك

العبارة MERGE لدمج من مصدر الى جهة مستهدفة

مثال على الاستخدام

كود :
MERGE INTO books b
  USING purchases p
  ON p.title = b.title and p.type = 'bk'
  WHEN MATCHED THEN
    UPDATE SET b.desc = b.desc || '; ' || p.desc
  WHEN NOT MATCHED THEN
    INSERT (title, desc, bought) values (p.title, p.desc, p.bought);

كود :
MERGE INTO customers c
        USING (SELECT * from customers_delta WHERE id > 10) cd
        ON (c.id = cd.id)
        WHEN MATCHED THEN
          UPDATE SET name = cd.name
        WHEN NOT MATCHED THEN
          INSERT (id, name) values (cd.id, cd.name);

كود :
MERGE INTO numbers
         USING (
           WITH RECURSIVE r(n) AS (
             SELECT 1 FROM rdb$database
             UNION ALL
             SELECT n+1 FROM r WHERE n < 200
           )
           SELECT n FROM r
         ) t
         ON numbers.num = t.n
         WHEN NOT MATCHED THEN
           INSERT(num) VALUES(t.n);

كيفية الحصول على عدد السجلات لأي استعلام دون تنفيذه؟

كود :
SELECT COUNT(*) FROM ( select * from employee where emp_no > 8 );

عبارة  current_connection تحفظ الاتصال الحالي


كود :
select current_connection from rdb$database

ويمكن اجراء عملية ما بها 

كود :
execute procedure P_Login(current_connection)

للحصول على التاريخ الان والساعة

كود :
select current_date from rdb$database


كود :
select current_time(2) from rdb$database



كود :
select current_time from rdb$database



العبارة  current_role للحصول على صلاحيات المستخدم الحالي

كود :
if (current_role <> 'MANAGER')
  then exception only_managers_may_delete;
else
  delete from Customers where custno = :custno;

للحصول على معرف العملية الحالية


كود :
select current_transaction from rdb$database

كود :
New.Txn_ID = current_transaction;


للحصول على اسم المستخدم الحالي

كود :
create trigger bi_customers for customers before insert as
begin
  New.added_by  = CURRENT_USER;
  New.purchases = 0;
end

كود :
create trigger bi_customers for customers before insert as
begin
  New.added_by  = USER;
  New.purchases = 0;
end




تستخدم في القوادح لمعرفة اذا كان هناك حدث حذف حصل

كود :
if (deleting) then
begin
  insert into Removed_Cars (id, make, model, removed)
    values (old.id, old.make, old.model, current_timestamp);
end


او اضافة او تعديل

كود :
if (inserting or updating) then
begin
  if (new.serial_num is null) then
    new.serial_num = gen_id(gen_serials, 1);
end


ماذا لو لم تكن تريد استخدام مولدات الارقام لاستخدامه مع المفاتيح الاساسية بالجداول
هناك طريقة يمكن فعل ذلك بها باستخدام القوادح .
فعند استخدام مولدات الارقام وكان اخر رقم عندك هو مثلا 23000 وقمت بفتح سجل جديد ثم الغيت العملية وعدت واضفت سجل جديد فسيكون الرقم 23002 وليس 23001
ويجب وقتها التدخل برمجيا واعادة الترقيم الى الخلف بمقدر 1 
او استخدام القوادح لاجراء الترقيم كما بالمثال التالي

كود :
if(Coalesce(new.id,0)=0) then
new.id = Coalesce((Select max(id) from doc),0)+1;
begin

حيث Doc اسم الجدول ويتم وضع هذه السطور في الحدث قبل الاضافة

ولكن لا ينصح بها اذا كانت بياناتك اكبر من مليون ولازالت تنمو لان جملة Max على البيانات الكثيرة فيها بطئ

بخصول حجم الصفحة في اعدادت ملف قاعدة البيانات دور مهم في اداء قاعدة البيانات

[صورة: dmiles841.gif]

[صورة: dmiles842.gif]

عند انشاء قاعدة بيانات جديدة افتراضيا يتم وضعه على 16384 وعند انشاء قاعدة البيانات لا يمكن تغييره بعدها الا بانشاء نسخ احتياطي وعملية استرجاع



العديد من العمليات المستندة إلى الفهرس (تعمل الفهارس بشكل أسرع إذا تم تقليل عمق الفهرس)
  • السجلات العريضة: مع وجود هياكل بيانات عريضة جدًا، أي مع العديد من الأعمدة الطويلة جدًا، يكون قراءة مجموعة البيانات أكثر فعالية. بالنسبة لمجموعات البيانات التي لا تلائم صفحة واحدة، يلزم قراءة عدة صفحات لاسترداد مجموعة بيانات واحدة. وينطبق الأمر نفسه على الكتابة، أي أن الجلب عبر عدة صفحات ضروري.
  • حقول blob الكبيرة: يتم تخزين البيانات واسترجاعها بكفاءة أكبر إذا كان عدد الصفحات التي تحتاج إلى جلبها أقل. مع البيانات blob الأكبر، تكون عمليات الكتابة والقراءة أكثر فعالية أيضًا، حيث يلزم على سبيل المثال 100 عملية وصول لعمود blob بحجم 100 كيلو بايت مع حجم صفحة 1 كيلو بايت. ولكن مع حجم صفحة 8 كيلو بايت، يلزم فقط 13 عملية.
  • حجم صفحة صغير: يكون حجم صفحة صغير كافياً إذا كان العديد من المعاملات يعيد فقط عددًا قليلاً من الأسطر. يمكن الوصول إلى هياكل الجداول النحيل مع صفحات قاعدة بيانات صغيرة بشكل أسرع للقراءة والكتابة حيث يلزم ذاكرة أقل، ويمكن الاحتفاظ بالمزيد من صفحات قاعدة البيانات في ذاكرة التخزين المؤقت. ومع ذلك، لا يُنصح باستخدام قاعدة بيانات بحجم صفحة أقل من 4096 على Windows، حيث أن هذا هو حجم كتلة Windows. لذلك، لا تقدم أحجام الصفحات الأصغر أي ميزات، حيث سيظل Windows يستخرج كتل 4 كيلو بايت.
تأثير حجم صفحة قاعدة البيانات على ذاكرة التخزين المؤقت:
  • يؤثر حجم صفحة قاعدة البيانات بشكل مباشر على مقدار ذاكرة التخزين المؤقت لقاعدة البيانات، والذي يؤثر على جميع النقاط المذكورة أعلاه. إذا تم تحديد حجم صفحة 16 كيلو بايت وحدد ذاكرة التخزين المؤقت لقاعدة بيانات خادم Firebird في firebird.conf بحد أقصى 128,000 صفحة، فسيتم توفير إجمالي ذاكرة تخزين مؤقت 2 غيغابايت لإيواء صفحات البيانات. لا يوفر نفس مواصفات ذاكرة التخزين المؤقت مع حجم صفحة 1 كيلو بايت سوى 180 ميغابايت من ذاكرة التخزين المؤقت. يُرجى الرجوع إلى تكوين الذاكرة للحصول على تفاصيل مواصفات ذاكرة التخزين المؤقت لخادم Firebird Superserver وخادم Classic.

عوامل أخرى يجب مراعاتها:
  • على الرغم من إمكانية إضاعة مساحة معينة بحجم صفحة كبير، إلا أنه لا ينبغي أن يكون هذا مشكلة خطيرة بأسعار الأجهزة الحالية، ويمكن أن يوفر مزايا أكبر في الأداء.
  • الطريقة الوحيدة لتغيير حجم صفحة قاعدة البيانات لاحقًا هي إجراء نسخة احتياطية لقاعدة البيانات يليها استعادة (بند قائمة IBExpert، الخدمات / استعادة قاعدة البيانات) حيث يمكن إعادة تعريف حجم صفحة قاعدة البيانات.
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
[-] كل من 3 users say قال شكرا ل Delphi4Us على المشاركة المفيدة
  • ALG2009, haniid, wadoud
الرد
#2
من الشرح السابق وكما قلنا لتغيير حجم صفحات قاعدة البيانات لا يمكن الا باجراء نسخ احتياطي واستعادة لقاعدة البيانات
وايضا حجم قاعدة البيانات يزيد ولا يمكن ان ينقص فلو خزنت مثلا صور واصبح حجم قاعدة البيانات 7 جيجا وحذفت ما فيها سيبقى 7 جيجا وهذه سوف نتطرق لها لاحقا فقاعدة بيانات فايربيرد لها تعامل خاص مع الملفات المحذوفة .

وعلى العموم ولمن لا يريد استخدام سطر الاوامر برمجت برنامج لازال تحت التجربة لاجراء نسخ احتياطي واستعادة لقاعدة البيانات وارجاعها لحجمها الطبيعي لو حدث فيها حذف .

فيديو يوضح العملية

[فيديو: https://www.youtube.com/watch?v=PaluT4bw1IE]

رابط التحميل

كود :
https://mega.nz/file/qxdzhAxS#DyYYN6ciTX9_4mYT2dYUT_l1qJmauwH-3DysaHcbBbg
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
[-] كل من 4 users say قال شكرا ل Delphi4Us على المشاركة المفيدة
  • haniid, ALG2009, Delphi2020, wadoud
الرد
#3
(03-02-2024, 06:55 PM)Delphi4Us كتب : من الشرح السابق وكما قلنا لتغيير حجم صفحات قاعدة البيانات لا يمكن الا باجراء نسخ احتياطي واستعادة لقاعدة البيانات
وايضا حجم قاعدة البيانات يزيد ولا يمكن ان ينقص فلو خزنت مثلا صور واصبح حجم قاعدة البيانات 7 جيجا وحذفت ما فيها سيبقى 7 جيجا وهذه سوف نتطرق لها لاحقا فقاعدة بيانات فايربيرد لها تعامل خاص مع الملفات المحذوفة .

وعلى العموم ولمن لا يريد استخدام سطر الاوامر برمجت برنامج لازال تحت التجربة لاجراء نسخ احتياطي واستعادة لقاعدة البيانات وارجاعها لحجمها الطبيعي لو حدث فيها حذف .

[فيديو: https://www.youtube.com/watch?v=PaluT4bw1IE]

رابط التحميل

كود :
https://mega.nz/file/qxdzhAxS#DyYYN6ciTX9_4mYT2dYUT_l1qJmauwH-3DysaHcbBbg

السلام عليكم ورحمة الله و بركاته،
جزاك الله خيرا ،
هل ممكن تتصدق علينا ب سورس كود للبرنامج؟
[-] كل من 1 user says قال شكرا ل Delphi2020 على المشاركة المفيدة
  • Delphi4Us
الرد
#4
وعليكم السلام ورحمة الله

لست قرب الجهاز الان وعلى العموم لا يوجد كود يستحق او كود سري او كود صعب

بالامكان استخدام اي مكونات لفعل ذلك .
على سبيل المثال مكونات فايرداك لاجراء نسخ احتياطي .

كود :
FDFBNBackup1.DriverLink := FDPhysFBDriverLink1;

FDFBNBackup1.UserName := 'sysdba';
FDFBNBackup1.Password := 'masterkey';
FDFBNBackup1.Host := 'db_srv_host';
FDFBNBackup1.Protocol := ipTCPIP;

FDFBNBackup1.Database := 'e:\fb\addemo.fdb';
FDFBNBackup1.BackupFile := 'e:\fb\addemo.backup';
FDFBNBackup1.Level := 0; // full backup

FDFBNBackup1.Backup;

وللاستعادة

كود :
FDFBNRestore1.DriverLink := FDPhysFBDriverLink1;

FDFBNRestore1.UserName := 'sysdba';
FDFBNRestore1.Password := 'masterkey';
FDFBNRestore1.Host := 'db_srv_host';
FDFBNRestore1.Protocol := ipTCPIP;

FDFBNRestore1.Database := 'e:\fb\addemo.fdb';
FDFBNRestore1.BackupFile := 'e:\fb\addemo.backup';

FDFBNRestore1.Restore;

الموضوع بسيط جدا .
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
[-] كل من 2 users say قال شكرا ل Delphi4Us على المشاركة المفيدة
  • wadoud, Delphi2020
الرد
#5
ايضا من الاشياء المهمة هي استخدام الحزم او الطرد في فايربيرد او ما يسمى PACKAGE
عند كثرة الاجراءات المخزنة والاجراءات والدوال تحدث خربطة فيها ولن تستطيع تغيير اسم اجراء مخزن الا باعادة بناءه باسم جديد ولكن في الحزم او الطرود يمكن تغيير اسماءها بدون اعادة بناءها وحذف القديم
والمهم هو تجميع الدوال والاجراءات وتصنيفها بحيث يسهل الوصول لها

بمعنى انك عند انشاء الاستعلامات او الاجراءات او الدوال باي مكان يمكنك الوصول للاجراءات والدوال تحت اسم حزمة معروف


الحزمة عبارة عن مجموعة من الإجراءات والوظائف التي تتم إدارتها ككيان واحد. تتناول فكرة " تغليف " مكونات التعليمات البرمجية لعملية قاعدة البيانات عدة أهداف:

النمذجة
والفكرة هي فصل كتل التعليمات البرمجية المترابطة إلى وحدات منطقية، كما تفعل لغات البرمجة.

من المعروف جيدًا في البرمجة أن تجميع التعليمات البرمجية بطرق مختلفة، في مساحات الأسماء أو الوحدات أو الفئات، على سبيل المثال، يعد أمرًا جيدًا. مع الإجراءات والوظائف القياسية في قاعدة البيانات، هذا غير ممكن. على الرغم من أنه يمكن تجميعها في ملفات نصية مختلفة، إلا أنه لا تزال هناك مشكلتان:

لا يتم تمثيل التجميع في بيانات تعريف قاعدة البيانات.

تشارك جميع الإجراءات المكتوبة في مساحة اسم ثابتة ويمكن استدعاؤها من قبل الجميع (نحن لا نشير إلى أذونات الأمان هنا).

لتسهيل تتبع التبعية
نريد آلية لتسهيل تتبع التبعية بين مجموعة من الإجراءات الداخلية ذات الصلة، وكذلك بين هذه المجموعة والإجراءات الأخرى، المجمعة وغير المجمعة.

تأتي حزم Firebird في جزأين: رأس (حزمة الكلمة الرئيسية) ونص ( نص حزمة الكلمة الرئيسية). هذا التقسيم يشبه إلى حد كبير وحدة دلفي، الرأس يتوافق مع جزء الواجهة والجسم يتوافق مع جزء التنفيذ.

يتم إنشاء الرأس أولاً (إنشاء حزمة) ويتبعه النص (إنشاء نص الحزمة).

عندما يحدد الروتين المعبأ أنه يستخدم كائن قاعدة بيانات معين، يتم تسجيل التبعية على هذا الكائن في جداول نظام Firebird. بعد ذلك، لإسقاط هذا الكائن أو ربما تغييره، عليك أولاً إزالة ما يعتمد عليه. وبما أن نص الحزمة يعتمد عليه، فيمكن إسقاط نص الحزمة هذا، حتى لو كان بعض كائنات قاعدة البيانات الأخرى يعتمد على هذه الحزمة. عندما يتم إسقاط الجسم، يبقى الرأس، مما يسمح لك بإعادة إنشاء جسمه بمجرد الانتهاء من التغييرات المتعلقة بالكائن الذي تمت إزالته.

لتسهيل إدارة الأذونات
من الممارسات الجيدة بشكل عام إنشاء إجراءات تتطلب الاستخدام المميز واستخدام الأدوار أو المستخدمين لتمكين الاستخدام المميز. نظرًا لأن Firebird يقوم بتشغيل إجراءات روتينية مع امتيازات المتصل، فمن الضروري أيضًا منح استخدام الموارد لكل روتين عندما لا تكون هذه الموارد متاحة مباشرة للمتصل. يجب منح استخدام كل روتين للمستخدمين و/أو الأدوار.

لا تحتوي الإجراءات المجمعة على امتيازات فردية. تعمل الامتيازات على الحزمة. الامتيازات الممنوحة للحزم صالحة لجميع إجراءات نص الحزمة، بما في ذلك الإجراءات الخاصة، ولكن يتم تخزينها لرأس الحزمة.

[صورة: attachment.php?aid=4814]

اذا نظرنا هنا لدينا حزمة باسم PKG1 ويمكن اطلاق اي اسم تريده وعند كتابتنا للاستعلام يمكننا الوصول لكل الاجراءات والوظائف والدوال التي فيها لنستخدمها


لانشاء رأس الحزمة وهنا نعلن عن كل الدوال والوظائف والاجراءات التي نريد الوصول لها من اي مكان من قاعدة البيانات

كود :
CREATE OR ALTER PACKAGE PKG1
AS
BEGIN
  PROCEDURE EMPLOYEE(I INT) RETURNS (O INT); -- public procedure
  FUNCTION EMP_COUNT RETURNS INT; -- public procedure
END

وبعدها ننشئ جسم لهذه العناوين الرئيسية

كود :
RECREATE PACKAGE BODY PKG1
AS
BEGIN

  FUNCTION F1(I INT) RETURNS INT; -- private function

  PROCEDURE EMPLOYEE(I INT) RETURNS (O INT)
  AS
  BEGIN

  END

  FUNCTION F1(I INT) RETURNS INT
  AS
  BEGIN
    RETURN 0;
  END

  FUNCTION EMP_COUNT RETURNS INT
  AS
  BEGIN
    RETURN 0;
  END

END 


وتكون تحمل نفس الاسم برأس الحزمة وهنا يتم برمجة الكود المطلوب لتنفيذ المهمة واذا كتبت هنا اي دالة او اجراء لا يوجد لها تعريف في رأس الحزمة وقتها ستكون دالة او اجراء محلي يمكن الوصول لها فقط من الاجراءات والدوال التي معها بجسم الحزمة .

طريقة ووظيفة عملها تماما كالاجراءات الداخلية فقط هي مرتبة في مجموعات


الملفات المرفقة
.jpg   1111.jpg (الحجم : 28.57 ك ب / التحميلات : 86)
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
[-] كل من 2 users say قال شكرا ل Delphi4Us على المشاركة المفيدة
  • Delphi2020, ALG2009
الرد
#6
بالنسبة للنسخ الاحتياطي والاستعادة وتغيير حجم الصفحات بقاعدة البيانات و تغيير مخزن الذاكرة توجد اداة وحيدة تأتي مع فايربيرد للقيام بهذا العمل

وهي عن طريق سطر الاوامر :
انتقل الى سطر الاوامر CMD وبعدها ادخل الى مجلد الفايربيرد
ثم لانشاء نسخ احتياطي اكتب

كود :
gbak -backup employee /backups/employee.fbk

حيث  employee اسم قاعدة البيانات وبدون مسار اذا كانت في نفس المجلد وبعدها  /backups/employee.fbk وهو مسار واسم ملف النسخة الاحتياطية
-backup هو مفتاح يشير الى رغبتنا في انشاء نسخ احتياطي

للاستعادة يتم عكس العملية السابقة 

كود :
gbak -replace /backups/employee.fbk employee

-replace هو مفتاح يشير الى رغبتنا في انشاء عملية استعادة

هذا المثال بأبسط صورة لان هناك الكثير من الخيارات والتي تتمثل في بعض المقاتيح التي يمكن استخدامها حسب الرغبة
تجدر الاشارة الى ان المفتاح  -replace سوف يستبدل ملف قاعدة البيانات القديم بالجديد ويمكن كتابة -r فقط

ولكن اذا اردت استعادة قاعدة البيانات في ملف جديد وانشاء قاعدة بيانات جديد يجب استخدام المفتاح -C او المفتاح  -REP

المفاتيح توجد ثلاث انواع منها
1: مفاتيح عامة تستخدم مع اوامر النسخ الاحتياطي او الاستعادة
2: مفاتيح تستخدم مع النسخ الاحتياطي فقط
3: مفاتيح تستخدم مع عمليات الاستعادة
وسوف نشرح منها المهم على الأقل في منشور لاحق
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
[-] كل من 3 users say قال شكرا ل Delphi4Us على المشاركة المفيدة
  • Delphi2020, ALG2009, anter2016
الرد
#7
جزاكم الله خيرا
حبذا لو قمت بإنشاء قاعدة بيانات من الصفر وكل مره نضيف لها أمر أو دالة من الدوال السابقة لتعم الفائده للجميع ويكون برنامج تعليمي
[-] كل من 2 users say قال شكرا ل ALG2009 على المشاركة المفيدة
  • Delphi2020, Delphi4Us
الرد
#8
إقتباس :حبذا لو قمت بإنشاء قاعدة بيانات من الصفر وكل مره نضيف لها أمر أو دالة من الدوال السابقة لتعم الفائده للجميع ويكون برنامج تعليمي

جربو انتم وانا ابحث و اتعلم وانقل اي جديد لكم بالمنتدى هنا ، وان كان هناك مشكلة سنراجعها سويا عندما تتاح الفرصة .
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
[-] كل من 2 users say قال شكرا ل Delphi4Us على المشاركة المفيدة
  • Delphi2020, ALG2009
الرد
#9
السلام عليكم

لماذا لم تجربوا ام ان الامر لم ينجح معكم

على العموم هذه قاعدة بيانات فيها Package  التي شرحناها 
ولكن المشكلة التي سوف تواجهكم بهذه الطريقة وهي انشاء قاعدة بيانات ووضع التجارب فيها انه ليس الكل يستخدم نفس الاصدار من فايربيرد
ولهذا الطريقة الافضل هي ان يجرب كل شخص في جهازه
انا استخدم فايربيرد 5


الملفات المرفقة
.rar   D4A.rar (الحجم : 65.9 ك ب / التحميلات : 15)
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
الرد
#10
استخدام Guardian ؟

لعلك لاحظت عند تثبيت فايربيرد بأنه يوجد خيار تثبيت Guardian في طريقك .

يعد Firebird Guardian أداة مساعدة تراقب عملية الخادم وتحاول إعادة تشغيله إذا تم إنهاؤه بشكل غير طبيعي. لا يعمل The Guardian مع Firebird Classic Server على نظام التشغيل Windows إذا تم تشغيله كتطبيق حتى إذا قمت بتثبيته كخدمة.

يعمل The Guardian بشكل صحيح مع Superserver، سواء تم تشغيله كتطبيق أو كخدمة.

إذا قمت بتشغيل Firebird كخدمة على نظام التشغيل Windows 2000 أو إصدار أحدث، فإن Guardian يعد وسيلة راحة وليس ضرورة، نظرًا لأن أنظمة التشغيل هذه تتمتع بإمكانية مراقبة الخدمات وإعادة تشغيلها. يوصى بإبقاء خيار Guardian قيد التشغيل (إن أمكن) في جميع المواقف الأخرى.
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم