<?xml version="1.0"?>
<rss version="2.0"><channel><title>DevOps: PostgreSQL</title><link>https://academy.hsoub.com/devops/servers/databases/postgresql/page/2/?d=4</link><description>DevOps: PostgreSQL</description><language>ar</language><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x62B;&#x628;&#x62A; PostgreSQL &#x648;&#x62A;&#x633;&#x62A;&#x62E;&#x62F;&#x645;&#x647; &#x639;&#x644;&#x649; Ubuntu 14.04</title><link>https://academy.hsoub.com/devops/servers/databases/postgresql/%D9%83%D9%8A%D9%81-%D8%AA%D8%AB%D8%A8%D8%AA-postgresql-%D9%88%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%85%D9%87-%D8%B9%D9%84%D9%89-ubuntu-1404-r147/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_11/postgresql-ubuntu.png.03201b9651bb33edaf0893c71726d795.png" /></p>

<p id="مقدمة">تعدّ أنظمة <a href="https://academy.hsoub.com/devops/databases/%D9%85%D9%82%D8%A7%D8%B1%D9%86%D8%A9-%D8%A8%D9%8A%D9%86-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D9%84%D8%A7%D9%82%D9%8A%D8%A9-sqlite-%D9%85%D8%B9-mysql-%D9%85%D8%B9-postgresql-r72/">إدارة قواعد البيانات العلاقية</a> Relational database management systems، عنصرا أساسيا في الكثير من مواقع الويب والتطبيقات؛ فهي تتيح وسيلة مبنية لتخزين المعلومات، تنظيمها والوصول إليها.</p><p>PostgrSQL (أو Postgres) هو نظام علاقي لإدارة قواعد البيانات يستخدم لغة الاستعلام SQL. يشيع استخدام PostgreSQL في المشاريع الصغيرة والكبيرة على حد السواء؛ ويتميز بتوافقه مع المعايير Standards ووجود خصائص متقدمة كثيرة مثل المعاملات Transactions الموثوقة والتزامن Concurrency دون قفل القراءة.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_11/postgresql-ubuntu.png.1d8065f98744c27444a1e0cf72a12f4f.png"><img data-fileid="8195" class="ipsImage ipsImage_thumbnailed" alt="postgresql-ubuntu.thumb.png.cf0bea029f82" src="https://academy.hsoub.com/uploads/monthly_2015_11/postgresql-ubuntu.thumb.png.cf0bea029f8206ae6793c4226a523aa4.png"></a></p><p>يشرح هذا المقال كيفية تثبيت Postgres على Ubuntu 14.04 وبعض الأمور الأساسية لاستخدامه.</p><h2 id="التثبيت">التثبيت</h2><p>تحتوي المستودعات الافتراضية لأوبنتو على حزم Postgres لذا يمكننا تثبيته بدون متاعب.</p><p>نبدأ بتحديث الحزم ثم تثبيت حزمتي <code>postgresql</code> و<code>postgresql-contrib</code>. تثبت الحزمة الأخيرة أدوات مساعدة ووظائف إضافية:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo apt-get update
sudo apt-get install postgresql postgresql-contrib</pre><p>نستطيع الآن بعد إكمال تثبيت البرنامج عرض كيفية عمله و فيمَ يختلف عن أنظمة إدارة قاعد البيانات المشابهة.</p><h2 id="استخدام-قواعد-بيانات-postgresql-وأدواره-roles">استخدام قواعد بيانات PostgreSQL وأدواره Roles</h2><p>يستخدم PostgreSQL مفهوم الدور للمساعدة في الاستيثاق Authentication والتصريح Authorization. يوجد شبه بين الأدوار في PostgreSQL وحسابات المستخدمين في الأنظمة الشبيهة بيونكس؛ إلا أن PostgreSQL لا يميّز بين المستخدمين والمجموعات ويفضل مفهوم الدور.</p><p>يستخدم PostgreSQL مباشرة بعد تثبيته طريقة الاستيثاق <code>ident</code> التي تتمثل في ربط دور PostgreSQL بحساب موافق له على لينكس/يونكس. يمكن الولوج إلى دور Postgres - إن وُجد - بالولوج إلى حساب المستخدم الموافق له على النظام.</p><p>تنشئ عملية التثبيت حساب مستخدم باسم <code>postgres</code> مربوطا بدور PostgreSQL الافتراضي. يجب الولوج إلى الحساب لكي نستطيع استخدام PostgreSQL؛ نفذ الأمر التالي لهذا الغرض:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo -i -u postgres</pre><p>سيُطلب منك إدخال كلمة سرك الاعتيادية ثم تُنقَل إلى محث Prompt مستخدم PostgreSQL.</p><p>نفذ الأمر التالي للحصول على محث PostgreSQL:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">psql</pre><p>ستُنقَل مباشرة إلى سطر أوامر يمكِّنك من التفاعل مع نظام قاعدة البيانات.</p><p>سنشرح في الفقرات المقبلة كيفية استخدام الأدوار الأخرى وقواعد البيانات من أجل الحصول على مرونة أكثر في المستخدم وقاعدة البيانات الذين نريد العمل معهما.</p><p>اخرج من محث PostgreSQL بتنفيذ الأمر:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">\q</pre><p>يعيدك الأمر إلى محث Shell الخاص بالمستخدم <code>postgres</code>.</p><p><strong>ملحوظة</strong>: إن نفذت الأمر <code>psql</code> دون الولوج إلى المستخدم <code>postgres</code> فستحصُل على رسالة خطأ تفيد بأن الدور الذي تستخدمه غير موجود.</p><h2 id="إنشاء-دور-جديد">إنشاء دور جديد</h2><p>يمكن لحساب <code>postgres</code> على لينكس الدخول إلى نظام قاعدة البيانات؛ إلا أن لديه أيضا إمكانية الوصول إلى أدوات لإنشاء الأدوار وقواعد البيانات نظرا لكونه مربوطا بالدور الإداري <code>Postgres</code>.</p><p>نستخدم الأمر التالي لإنشاء دور جديد:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">createuser --interactive</pre><p>الأمر في الأساس هو سكربت Shell تفاعلي يستدعي أوامر Postgres الصحيحة من أجل إنشاء دور وفقا لما تحدده. يطرح السكربت سؤالين الأول اسم الدور، والثاني هل يجب أن تكون لديه صلاحيات إدارية أم لا. في حال الإجابة بلا على السؤال الثاني تضاف بعض الأسئلة الأخرى مثل هل يُسمح له بإنشاء قاعدة بيانات. توجد خيارات أخرى للاستخدام مع أمر <code>createuser</code> يمكن الاطلاع عليها بتنفيذ الأمر:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">man createuser</pre><h2 id="إنشاء-قاعدة-بيانات-جديدة">إنشاء قاعدة بيانات جديدة</h2><p>يفترض PostgreSQL عند تثبيته، إضافةً إلى طريقة الاستيثاق (ربط دور PostgreSQL بحساب موافق له على لينكس/يونكس)، وجودَ قاعدة بيانات موافقة للدور المراد الاتصال به. يعني هذا أنه إن كان يوجد دور باسم <code>test1</code> فإنه سيحاول افتراضا (أي عند استخدام أمر <code>psql</code> دون خيارات إضافية) الاتصال بقاعدة بيانات باسم <code>test1</code>.</p><p>ينشئ اﻷمر التالي قاعدة بيانات مناسبة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">createdb test1</pre><h2 id="استخدام-الدور-الجديد-للاتصال-بـpostgresql">استخدام الدور الجديد للاتصال بـPostgreSQL</h2><p>سنفترض أن لديك حساب لينكس باسم <code>test1</code> (نفذ اﻷمر <code>adduser test1</code> لإنشائه)، وأنك أنشأت دور PostgreSQL وقاعدة بيانات مع تسمية الدور وقاعدة البيانات بـ<code>test1</code>.</p><p>نفذ الأمر التالي للانتقال لاستخدام الحساب <code>test1</code> على لينكس:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo -i -u test1</pre><p>ثم يمكنك بعدها الاتصال بقاعدة البيانات <code>test1</code> بالدور <code>test1</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">psql</pre><p>ستلج مباشرة إلى محث إدارة قاعدة البيانات.</p><p>استخدم الخيار <span style="font-family:courier new,courier,monospace;"><code>d-</code></span> مع ذكر اسم قاعدة البيانات، إن أردت أن يتصل الدور بقاعدة بيانات مختلفة عن تلك الموافقة له في الاسم:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">psql -d postgres</pre><p>يعطيك الأمر التالي معلومات عن دور PostgreSQL الذي تستخدمه للاتصال وقاعدة البيانات التي تتصل بها:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">\conninfo

You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5432".
</pre><p>يساعد الأمر في تذكيرك بالإعدادات الحالية.</p><h2 id="إنشاء-جداول-البيانات">إنشاء جداول البيانات</h2><p>نبدأ، بعد أن تعرفنا على كيفية الاتصال بنظام PostgreSQL لإدارة قواعد البيانات، بعرض طريقة تنفيذ بعض المهام الأساسية.</p><p>سننشئ أولا جدولا Table نحفظ فيه بيانات، وليكن الجدول عن أدوات تُستخدَم في الملعب.</p><p>في ما يلي الصيغة القاعدية لإنشاء جدول:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">CREATE TABLE table_name (
   column_name1 col_type (field_length) column_constraints,
   column_name2 col_type (field_length),
   column_name3 col_type (field_length)
);</pre><p>نبدأ بتعريف اسم جدول البيانات <code>table_name</code>، ثم الأعمدة Columns المكوِّنة للجدول (<code>column_name2</code>، <code>column_name1</code> و<code>column_name3</code>). نحدّد نوع البيانات التي يحويها كل عمود (<code>col_type</code>) وطولها (<span style="font-family:courier new,courier,monospace;"><code>field_length</code></span>). يمكن أيضا وضع قيود constraints على العمود (<code>column_constraints</code>).</p><p>ننشئ لغرض التجربة الجدول المحدود التالي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">CREATE TABLE playground (
   equip_id serial PRIMARY KEY,
   type varchar (50) NOT NULL,
   color varchar (25) NOT NULL,
   location varchar(25) check (location in ('north', 'south', 'west', 'east', 'northeast', 'southeast', 'southwest', 'northwest')),
   install_date date
);</pre><p>أنشأنا جدولا باسم <code>playground</code> لسرد بضع معدّات رياضية نمتلكها. العمود الأول من الجدول <code>equip_id</code> هو معرِّف الأداة ونوعه <code>serial</code> (عدد صحيح يزداد تلقائيّا مع كل إدخال للبيانات في الجدول). وضعنا القيد <code>PRIMARY KEY</code> على العمود الأول للإشارة إلى أن قيمة العمود يجب أن تكون وحيدة (أي لا توجد أداتان في الجدول لديهما نفس قيمة العمود الأول) وغير خاوية.</p><p>العمودان الثاني والثالث يحدّدان على التوالي نوع الأداة ولونها؛ لا يمكن أن يكون أي من العمودين خاويا بسبب وضع القيد <code>NOT NULL</code> عليهما. وضعنا على العمود الرابع قيدا يتمثل في أن قيمة الحقل يجب أن تكون واحدة من ثمانية قيم ممكنة. يسجل العمود الأخير تاريخ تثبيت الأداة لذا أعطيناه نوع البيانات <code>date</code>.</p><p>لم نحدّد لاثنين من الأعمدة طول البيانات، ويعود السبب في ذلك أن بعض الأنواع تحدد تلقائيا طول الحقل.</p><p>نستخدم الأمر التالي لعرض الجداول الموجودة في قاعدة البيانات التي نعمل عليها:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">\d</pre><p>النتيجة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">                 List of relations

Schema |          Name           |   Type   |  Owner   
--------+-------------------------+----------+----------
public | playground              | table    | postgres
public | playground_equip_id_seq | sequence | postgres
(2 rows)</pre><p>يظهر جدول <code>playground</code> الذي أنشأناه؛ ولكن يوجد معه أمر آخر: <code>playground_equip_id_seq</code> وهو من نوع <code>sequence</code> (متتالية). المتتالية <code>playground_equip_id_seq</code> هي تمثيل لنوع البيانات <code>serial</code> الذي حددناه للعمود <code>equip_id</code>. تخزن المتتالية العدد الذي يجب أن تُعطَى قيمته للعمود عند العملية الموالية لإضافة البيانات في الجدول.</p><p>يصبح الأمر على النحو التالي إن أردت رؤية الجداول فقط:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">\dt</pre><p>النتيجة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">         List of relations

Schema |    Name    | Type  |  Owner   
--------+------------+-------+----------
public | playground | table | postgres
(1 row)</pre><h2 id="إضافة-تسجيلات-لجدول-الاستعلام-عنها-وحذفها">إضافة تسجيلات لجدول، الاستعلام عنها وحذفها</h2><p>الخطوة التالية لإنشاء جدول هي إضافة بيانات إليه. لإضافة تسجيلات Records إلى جدول نحدّد اسم الجدول، نسمي الأعمدة ثم نوفر البيانات لكل عمود. سنضيف لوح انزلاق Swing وأرجوحة Slide إلى جدول <code>playground</code> على النحو التالي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">INSERT INTO playground (type, color, location, install_date) VALUES ('slide', 'blue', 'south', '2014-04-28');
INSERT INTO playground (type, color, location, install_date) VALUES ('swing', 'yellow', 'northwest', '2010-08-16');
</pre><p>لاحظ أن قيمة العمود يجب أن تكون بين ظفرين<code>''</code> بينما لا يحتاج اسم العمود لذلك. لاحظ أيضا أننا لم نذكر اسم العمود <code>equip_id</code> ولم نعطه بالتالي قيمة. يعود السبب في ذلك إلى أن العمود من نوع <code>serial</code> أي أنه سيحصُل على قيمة موّلَّدة تلقائيا في كل مرة يُضاف فيها سطر (تسجيلة) جديد إلى الجدول.</p><p>الاستعلام التالي يُظهِر جميع البيانات المخزَّنة في جدول <code>playground</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">SELECT * FROM playground;</pre><p>النتيجة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint"> equip_id | type  | color  | location  | install_date 
----------+-------+--------+-----------+--------------
1 | slide | blue   | south     | 2014-04-28
2 | swing | yellow | northwest | 2010-08-16
(2 rows)</pre><p>تمكن ملاحظة أن العمود <code>equip_id</code> مُلئ بأعداد متتالية وأن البيانات الأخرى نُظِّمت على النحو المرغوب.</p><p>افترض أن لوح الانزلاق كُسر ولم يعد ضمن المعدات التي نمتلكها؛ سنحتاج في هذه الحالة لحذفه من قاعدة البيانات، يؤدي الاستعلام التالي هذا الغرض:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">DELETE FROM playground WHERE type = 'slide';</pre><p>لنعد إظهار جميع البيانات الموجودة في الجدول:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">SELECT * FROM playground;</pre><p>النتيجة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint"> equip_id | type  | color  | location  | install_date 
----------+-------+--------+-----------+--------------
2 | swing | yellow | northwest | 2010-08-16
(1 row)</pre><h2 id="حذف-أو-إضافة-أعمدة-إلى-جدول">حذف أو إضافة أعمدة إلى جدول</h2><p>يمكننا بسهولة إضافة أعمدة جديدة إلى جدول بعد إنشائه. يضيف الاستعلام التالي عمودا باسم <code>last_maint</code> لحفظ تاريخ آخر صيانة للأداة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">ALTER TABLE playground ADD last_maint date;</pre><p>إن عرضنا البيانات المخزّنة في الجدول الآن فسنرى أن العمود الجديد أُضيف (غير أنه لا توجد به بيانات):</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">SELECT * FROM playground;</pre><p>النتيجة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">equip_id | type  | color  | location  | install_date | last_maint 
----------+-------+--------+-----------+--------------+------------
2 | swing | yellow | northwest | 2010-08-16   | 
(1 row)</pre><p>يمكننا بطريقة مشابهة حذف عمود:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">ALTER TABLE playground DROP last_maint;</pre><h2 id="تحديث-بيانات-جدول">تحديث بيانات جدول</h2><p>تناولنا كيفية إضافة تسجيلات إلى الجدول وحذفها، ولكننا لم نغطِّ بعد كيفية التعديل على بيانات موجودة.</p><p>لتغيير قيمة موجودة في جدول البيانات نستعلم عن التسجيلة المُراد تعديلها ونسمي العمود الذي نريد تغيير قيمته ونعطي القيمة الجديدة. في المثال التالي نستعلم عن التسجيلات التي قيمة العمود <code>type</code> فيها تساوي <code>swing</code> ثم نبدِل قيمة العمود <code>color</code> في هذه التسجيلات إلى <code>red</code>. في حال وجود أكثر من تسجيلة ينطبق عليها الاستعلام فستُصبح قيمة العمود <code>color</code> فيها جميعا تساوي <code>red</code>.</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">UPDATE playground SET color = 'red' WHERE type = 'swing';</pre><p>يمكن التأكد من نجاح تحديث البيانات بالاستعلام عن محتويات الجدول مرة أخرى:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">SELECT * FROM playground;</pre><p>النتيجة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint"> equip_id | type  | color | location  | install_date | last_maint 
----------+-------+-------+-----------+--------------+------------
2 | swing | red   | northwest | 2010-08-16   | 
(1 row)</pre><p>يظهر في نتيجة الاستعلام أن اللون الجديد (<code>color</code>) للأرجوحة (<code>swing</code>) هو الأحمر (<code>red</code>).</p><p>ترجمة -وبتصرف- لمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-ubuntu-14-04">How To Install and Use PostgreSQL on Ubuntu 14.04</a> لصاحبه Justin Ellingwood.</p>
]]></description><guid isPermaLink="false">147</guid><pubDate>Mon, 30 Nov 2015 12:55:59 +0000</pubDate></item></channel></rss>
