إدخال القيم الافتراضية والأعمدة المحسوبة
-
24-09-2019 - |
سؤال
بالنسبة لمكتبة Perl التي تتفق مخططات Sybase لـ DBIX :: Class (:: Schema :: Loader) ، يجب أن أكون قادرًا على استخدام الإعدادات الافتراضية والأعمدة المحسوبة.
لنفترض أن لدينا:
create table bar (
id INTEGER IDENTITY PRIMARY KEY,
foo VARCHAR(10) DEFAULT 'foo',
adt AS getdate(),
ts timestamp
)
هنا بقدر ما حصلت عليه:
select substring(c.name,1,5) name, c.cdefault, c.computedcol from syscolumns c
join sysobjects o on c.id = o.id where o.name = 'bar' and o.type = 'U'
name cdefault computedcol
---------- ----------- -----------
id 0 NULL
foo 602182610 NULL
adt 0 618182667
ts 0 NULL
هذا يخبرني أن العمود "FOO" لديه إجراء مخزن مع ID 602182610 الذي يعيد القيمة. كيف يمكنني الحصول على الافتراضي الأصلي "foo" من هذا المعرف؟
لا يحتوي عمود الطوابع الزمنية على كائن عمود محسّن ولا Sproc افتراضي ، لكنني بحاجة بطريقة ما إلى معرفة أنه في الواقع عمود طابع زمني. إن النظر إلى نوع البيانات الذي تم إرجاعه بواسطة DBI لأنه يخبرني أنه "varbinary" ، وهو التمثيل الداخلي لجهاز الطابع الزمني. كيف أعرف ما إذا كان ذلك أم لا؟
يخبرني أيضًا أن العمود "ADT" هو عمود محسوب ، كائن لهذا العمود يحتوي على معرف 618182667.
إن النظر إلى sysobjects لهذا المعرف يخبرني القليل الذي يبدو أنه مفيد باستثناء:
select substring(name,1,15) name, type from sysobjects where id = 618182667
name type
------------------------------ ----
bar_adt_6181826 C
أي مساعدة موضع تقدير كبير.
المحلول
بخصوص سؤالك الأول ، حول التخلف عن السداد
select text from syscomments
where id = 602182610
أما بالنسبة لأعمدة الطابع الزمني ، فإن type
عمود في المراجع Syscolumns systypes.type
. في هذا الجدول name
يحتوي العمود على اسم نوع البيانات.
نصائح أخرى
هذا هو الاستعلام الذي انتهى به الأمر في حالة اهتمام أي شخص:
SELECT c.name name, t.name type, cm.text deflt
FROM syscolumns c
JOIN sysobjects o ON c.id = o.id
LEFT JOIN systypes t ON c.type = t.type AND c.usertype = t.usertype
LEFT JOIN syscomments cm
ON cm.id = CASE WHEN c.cdefault = 0 THEN c.computedcol ELSE c.cdefault END
WHERE o.name = 'table_name' AND o.type = 'U'
يبدو أنه يعمل بشكل جيد ، على الرغم من أنني ما زلت بحاجة إلى كتابة المزيد من اختبارات نوع البيانات :)