কীভাবে ওরাকলে একটি জিইউডি জেনারেট করা যায়?


90

কোনও সন্নিবেশ বিবৃতিতে কোনও জিইউডি স্বয়ংক্রিয়ভাবে তৈরি করা সম্ভব?

এছাড়াও, এই জিইউডিটি সঞ্চয় করতে আমার কোন ধরণের ক্ষেত্র ব্যবহার করা উচিত?

উত্তর:


139

আপনার সন্নিবেশ বিবৃতিতে একটি জিইউডি উত্পন্ন করতে আপনি SYS_GUID () ফাংশনটি ব্যবহার করতে পারেন:

insert into mytable (guid_col, data) values (sys_guid(), 'xxx');

জিইউইডিগুলি সঞ্চয় করার জন্য পছন্দসই ডেটাটাইপটি হ'ল র (16)।

গোপীনাথ উত্তর হিসাবে:

 select sys_guid() from dual
 union all
 select sys_guid() from dual
 union all 
 select sys_guid() from dual

তুমি পাও

88FDC68C75DDF955E040449808B55601
88FDC68C75DEF955E040449808B55601
88FDC68C75DFF955E040449808B55601

যেমন টনি অ্যান্ড্রুজ বলেছেন, কেবল একটি চরিত্রে আলাদা

88FDC68C75D ডি F955E040449808B55601
88FDC68C75D E F955E040449808B55601
88FDC68C75D F F955E040449808B55601

সম্ভবত দরকারী: http://feuerferencests.blogspot.com/2006/02/watch-out-for-sequential-oracle-guids.html


অদ্ভুত, sys_guid () সর্বদা আমাকে একই জিইউইডি দিচ্ছে .. আমাকে কি ফাংশনে বীজ দেওয়ার দরকার আছে বা?
এসিবি

11
আপনি কি নিশ্চিত যে তারা ঠিক একই রকম? এটি খুব অনুরূপ (তবে ভিন্ন) মানগুলি ফেরানোর ঝোঁক দেয় - উদাহরণস্বরূপ যখন আমি মাত্র চেষ্টা করেছি আমি 88FDC68C75DEF955E040449808B55601 এবং 88FDC68C75DFF955E040449808B55601 পেয়েছি, যা কেবলমাত্র 12 তম চরিত্রের চেয়ে পৃথক!
টনি অ্যান্ড্রুজ

দ্বৈত এবং তুলনা মান থেকে sys_guid () নির্বাচন করুন। এটি সম্পর্কে উত্তর পরিবর্তন করুন।
কিকিনেট

26

আপনি ডিফল্ট হিসাবে সারণীর তৈরি বিবৃতিতে গাইড অন্তর্ভুক্ত করতে পারেন, উদাহরণস্বরূপ:

create table t_sysguid
( id     raw(16) default sys_guid() primary key
, filler varchar2(1000)
)
/

এখানে দেখুন: http://rwijk.blogspot.com/2009/12/sysguid.html


আমি একটি দরকারী ওরাকল বৈশিষ্ট্য সম্পর্কে সতর্ক করার জন্য ধন্যবাদ যা আমি জানতাম না।
স্টিভটি

7

একটি সন্নিবেশ বিবৃতিতে নির্দেশিকা স্বয়ংক্রিয়ভাবে উত্পন্ন করার অর্থ কী তা পরিষ্কার নয় তবে অনুমানের ভিত্তিতে, আমি মনে করি আপনি নীচের মতো কিছু করার চেষ্টা করছেন:

INSERT INTO MY_TAB (ID, NAME) VALUES (SYS_GUID(), 'Adams');
INSERT INTO MY_TAB (ID, NAME) VALUES (SYS_GUID(), 'Baker');

সেক্ষেত্রে আমি বিশ্বাস করি আইডি কলামটি RAW (16) হিসাবে ঘোষণা করা উচিত;

আমি আমার মাথার উপরের অংশ থেকে এটি করছি। এর বিরুদ্ধে পরীক্ষা করার জন্য আমার কাছে ওরাকল উদাহরণ নেই, তবে আমি মনে করি আপনি এটি চান।



5

sys_guid () একটি দুর্বল বিকল্প, যেমন অন্যান্য উত্তর উল্লেখ করেছে mentioned ইউআইডিগুলি উত্পন্ন করার এবং অনুক্রমিক মানগুলি এড়ানোর একটি উপায় হ'ল র্যান্ডম হেক্স স্ট্রিং নিজে তৈরি করা:

select regexp_replace(
    to_char(
        DBMS_RANDOM.value(0, power(2, 128)-1),
        'FM0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'),
    '([a-f0-9]{8})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{12})',
    '\1-\2-\3-\4-\5') from DUAL;

4
এগুলি অনন্য হওয়ার গ্যারান্টিযুক্ত নয়। আপনি যেখানে স্টোর করছেন সেখানে এটিকে অনন্য বাধার মতো কিছু দিয়ে যুক্ত করতে হবে pair (এবং যদি আপনি কোনও পুনরাবৃত্ত মানটির মুখোমুখি হন এবং অনন্য প্রতিবন্ধকতাটি লঙ্ঘন করেন তবে একটি নতুন সংখ্যা তৈরি করা)
জেমস ডেইলি


2

আপনি আপনার ইউআইডি উত্পন্ন করতে ফাংশন বেলো ব্যবহার করতে পারেন

create or replace FUNCTION RANDOM_GUID
    RETURN VARCHAR2 IS

    RNG    NUMBER;
    N      BINARY_INTEGER;
    CCS    VARCHAR2 (128);
    XSTR   VARCHAR2 (4000) := NULL;
  BEGIN
    CCS := '0123456789' || 'ABCDEF';
    RNG := 15;

    FOR I IN 1 .. 32 LOOP
      N := TRUNC (RNG * DBMS_RANDOM.VALUE) + 1;
      XSTR := XSTR || SUBSTR (CCS, N, 1);
    END LOOP;

    RETURN SUBSTR(XSTR, 1, 4) || '-' ||
        SUBSTR(XSTR, 5, 4)        || '-' ||
        SUBSTR(XSTR, 9, 4)        || '-' ||
        SUBSTR(XSTR, 13,4)        || '-' ||
        SUBSTR(XSTR, 17,4)        || '-' ||
        SUBSTR(XSTR, 21,4)        || '-' ||
        SUBSTR(XSTR, 24,4)        || '-' ||
        SUBSTR(XSTR, 28,4);
END RANDOM_GUID;

উপরের ফাংশনটির দ্বারা জিনেটেড জিইউডির উদাহরণ:
8EA4-196D-BC48-9793-8AE8-5500-03DC-9D04


SYS_GUID আমাদের প্রয়োজনের জন্য পর্যাপ্ত পরিমাণে এলোমেলো ছিল না, তবে এটি জিইউইডিটিকে এলোমেলোভাবে পাম্প করে বলে মনে হচ্ছে।
ThePeter

1

আপনার যদি অ-অনুক্রমিক গাইডের প্রয়োজন হয় তবে আপনি sys_guid()একটি হ্যাশিং ফাংশনের মাধ্যমে ফলাফলগুলি পাঠাতে পারেন ( https://stackoverflow.com/a/22534843/1462295 দেখুন )। ধারণাটি হ'ল আসল সৃষ্টি থেকে যা কিছু স্বতন্ত্রতা ব্যবহৃত হয় তা রাখুন এবং আরও বেশি বিচলিত বিট দিয়ে কিছু পান।

এই ক্ষেত্রে:

LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32))  

ডিফল্ট ক্রমিক নির্দেশিকা বনাম হ্যাশের মাধ্যমে পাঠানোর উদাহরণ:

SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL  

আউটপুট

80c32a4fbe405707e0531e18980a1bbb
80c32a4fbe415707e0531e18980a1bbb
80c32a4fbe425707e0531e18980a1bbb
80c32a4fbe435707e0531e18980a1bbb
c0f2ff2d3ef7b422c302bd87a4588490
d1886a8f3b4c547c28b0805d70b384f3
a0c565f3008622dde3148cfce9353ba7
1c375f3311faab15dc6a7503ce08182c

0

আমি ওরাকলের "dbms_crypto.randombytes" ফাংশনটি ব্যবহার করার পরামর্শ দেব।

কেন? এই ফাংশনটি একটি ক্রিপ্টোগ্রাফিক সুরক্ষিত সিউডো-র্যান্ডম ক্রমযুক্ত বাইটের একটি কাঁচা মান দেয়, যা এনক্রিপশন কীগুলির জন্য এলোমেলো উপাদান উত্পন্ন করতে ব্যবহৃত হতে পারে।

select REGEXP_REPLACE(dbms_crypto.randombytes(16), '(.{8})(.{4})(.{4})(.{4})(.{12})', '\1-\2-\3-\4-\5') from dual;

আপনি কেবলমাত্র একটি অক্ষর পরিবর্তিত হলে "sys_guid" ফাংশনটি ব্যবহার করবেন না।

ALTER TABLE locations ADD (uid_col RAW(16));

UPDATE locations SET uid_col = SYS_GUID();

SELECT location_id, uid_col FROM locations
   ORDER BY location_id, uid_col;

LOCATION_ID UID_COL
----------- ----------------------------------------------------------------
       1000 09F686761827CF8AE040578CB20B7491
       1100 09F686761828CF8AE040578CB20B7491
       1200 09F686761829CF8AE040578CB20B7491
       1300 09F68676182ACF8AE040578CB20B7491
       1400 09F68676182BCF8AE040578CB20B7491
       1500 09F68676182CCF8AE040578CB20B7491

https://docs.oracle.com/database/121/SQLRF/funitions202.htm#SQLRF06120

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.