بلاگ IRAN OUG


به وبلاگ IRAN OUG (گروه کاربران اوراکل ایران) خوش آمدید.


تازه ترین مطالب کارشناسان این صنعت را بررسی کنید. برای مشاهده مطلب مورد نظر می توانید جستجو کنید.

آیا می خواهید مطالب خود را در اینجا مشاهده کنید؟ مطالب خود را بفرستید ثبت مطالب من

مطالب کاربران

جلوگیری از اجرای دستورات DDL ای کاربر - Securityچهارشنبه, 13 دی 1396 - حامد اسماعیلی-
موضوع: Database

گاهی اوقات نیاز است که بطور مثال کاربر نتواند اقدام به ALTER نمودن جداول نماید . در مثال زیر تمامی دسترسیهای کاربر به جز دستور TRUNCATE گرفته میشود.

CREATE OR REPLACE TRIGGER TEST.DDLTrigger
  BEFORE DDL ON schema
BEGIN
  if (ora_sysevent = 'TRUNCATE') then
    null; -- I do not care about truncate
  else
    raise_application_error(-20000, 'YOU CAN NOT DO DDL!');
  end if;
END;
/
روش دوم :

در مثال بالا با توجه به اینکه تریگر فوق بایستی در اسکیمای کاربر باشد ، در صورتی که کاربر اقدام به حذف و یا غیر فعال نمودن تریگر نماید ، دسترسی زدن DDL برایش باز میشود . حال در مثال زیر روشی را پیاده سازی میکنیم که از نظر امنیتی بهتر باشد. در حالت کلی با توجه به اینکه هر کاربر OWNER جداول خودش است نمیتوان دسترسی ALTER را از او گرفت . پس یک کاربر دیگر میسازیم و مراحل زیر را طی میکنیم.

1- ایحاد کاربر جدید (میتوان از اسکریپت ساخت کاربر قبلی کمک گرفت)

2- ایجاد SYNONYM از روی جداول کاربر قبلی(میتوان از اسکریپت زیر کمک گرفت)

3- دادن دسترسی های DML ای بر روی جداول اسکیمای قبلی

begin
for x in ( select table_name from DBA_TABLES where owner= 'TEST')
loop
dbms_output.put_line('CREATE OR REPLACE SYNONYM TEST2.' || x.table_name || ' FOR TEST.'|| x.table_name ||';');
dbms_output.put_line('GRANT DELETE, INDEX, INSERT, REFERENCES, SELECT, UPDATE, ON COMMIT REFRESH, QUERY REWRITE, DEBUG, FLASHBACK ON ACHDD5.' || x.table_name || ' TO TEST2;');
end loop;
end;
برچسب: Security,Database
ایجاد ارتباط SSL در پایگاه داده اوراکل - Securityچهارشنبه, 13 دی 1396 - حامد اسماعیلی-
موضوع: Database

با دنبال کردن مراحل زیر میتوان ارتباط بین برنامه و دیتابیس را ایجاد کرد.

در این مستند فرض را بر این گرفته که server با نام ol7-121.localdomain بوده و client یک سیستم ویندوزی با نام "my-computer" میباشد و oracle client بر روی آن نصب میباشد.

 

ایجاد wallet بر روی سرور:

  1. ساخت wallet بصورت auto_login بر روی سرور

 

$ mkdir -p /u01/app/oracle/wallet

 

$ orapki wallet create -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 -auto_login_local

 

  1. ساخت certificate بصورت self-signed  و load به wallet

$  orapki wallet add -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 -dn "CN=`hostname`" -keysize 1024 -self_signed -validity 3650

 

  1. بررسی محتویات wallet
$ orapki wallet display -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123

 

  1. خروجی گرفتن از certificate برای ورود به wallet در سمت client
$ orapki wallet export -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 -dn "CN=`hostname`" -cert /tmp/`hostname`-certificate.crt

 

 

 

 

  1. بررسی محتویات certificate
$ cat /tmp/`hostname`-certificate.crt

 

-----BEGIN CERTIFICATE-----
MIIBqzCCARQCAQAwDQYJKoZIhvcNAQEEBQAwHjEcMBoGA1UEAxMTb2w3LTEyMS5sb2NhbGRvbWFpbjAeFw0xNTA2MjYxNDQyMDJaFw0yNTA2MjMxNDQyMDJaMB4xHDAaBgNVBAMTE29sNy0xMjEubG9jYWxkb21haW4wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJIrU1fGWAwMxRobFsS0UZBD1jFUwAvnH9blsynhrQrZSkwyMBWGPRFq5tufRpaifoNVVHSrjJm/nti62A6RXECAKsug9rHL8T11FOgP3R/+Itw2jLzwpdk7MbHMxpNHz6Y2IPCmBsJ5+625dRxugVKhLsIitAW5cUpT28bkrMl9AgMBAAEwDQYJKoZIhvcNAQEEBQADgYEABqQaP056WcPNgzSAOhJgTU/6D8uAFGCgUN57HoraXxgAN3HgmeGqhQfpb8tP+xeTF3ecqvWqJQHGdAJbuhRwpNR1rRovvlOxiv4gl0AplRzRuiygXfi6gst7KNmAdoxrTOcUQsqf/Ei9TaFl/N8E+88T2fK67JHgFa4QDs/XZWM=
-----END CERTIFICATE-----
$

 

ایجاد wallet بر روی کلاینت :

در صورتیکه این مرحله بر روی ویندوز اجرا گردد نیاز به oracle client خواهیم داشت.

  1. ایجاد wallet بصورت auto_login
d:\>mkdir -p d:\app\oracle\wallet
d:\>orapki wallet create -wallet "d:\app\oracle\wallet" -pwd WalletPasswd123 -auto_login
  1. ساخت certificate بصورت self-signed  و load به wallet
d:\>orapki wallet add -wallet "d:\app\oracle\wallet" -pwd WalletPasswd123 -dn "CN=%computername%" -keysize 1024 -self_signed -validity 3650
  1. با دستور زیر wallet را میتوانید بررسی کنید. توجه کنید که مقدار cn که با نام کامپیوتر برابر است باید در قسمت user و trusted certificate وجود داشته باشد.
d:\>orapki wallet display -wallet "d:\app\oracle\wallet" -pwd WalletPasswd123
Oracle PKI Tool : Version 11.2.0.3.0 - Production
Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.

 
Requested Certificates:
User Certificates:
Subject:        CN=my-computer
Trusted Certificates:
Subject:        OU=Class 2 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US
Subject:        OU=Secure Server Certification Authority,O=RSA Data Security\, Inc.,C=US
Subject:        CN=GTE CyberTrust Global Root,OU=GTE CyberTrust Solutions\, Inc.,O=GTE Corporation,C=US
Subject:        CN=my-computer
Subject:        OU=Class 3 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US
Subject:        OU=Class 1 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US
  1. خروجی گرفتن از certificate برای ورود به wallet در سمت Server
d:\>orapki wallet export -wallet "d:\app\oracle\wallet" -pwd WalletPasswd123 -dn "CN=%computername%" -cert d:\%computername%-certificate.crt
  1. بررسی certificate
d:\>more d:\%computername%-certificate.crt

تبادل certificate ها  :

  1. در ابتدا certificate خروجی گرفته شده در سمت server را در درایو C بر روی  clientکپی کرده و برعکس ، certificate خروجی گرفته شده در سمت client را بر روی /tmp  از server کپی میکنیم.

در ابتدا بر روی کلاینت دستور زیر را اجرا میکنیم:

d:\>orapki wallet add -wallet "d:\app\oracle\wallet" -pwd WalletPasswd123 -trusted_cert -cert d:\ol7-121.localdomain-certificate.crt

در اینجا بجای d:\ol7-121.localdomain-certificate.crt میبایست مسیر و نام certificate کپی شده از روی سرور جایگزین گردد.

  1. در این قسمت wallet بر روی client را بررسی میکنیم:
d:\>orapki wallet display -wallet "d:\app\oracle\wallet" -pwd WalletPasswd123 

میبایست نام سرور در قسمت Trusted Certificates اضافه شده باشد.

Requested Certificates:
User Certificates:
Subject:        CN=my-computer
Trusted Certificates:
Subject:        OU=Secure Server Certification Authority,O=RSA Data Security\, Inc.,C=US
Subject:        OU=Class 2 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US
Subject:        CN=my-computer
Subject:        OU=Class 3 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US
Subject:        OU=Class 1 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US
Subject:        CN=ol7-121.localdomain
Subject:        CN=GTE CyberTrust Global Root,OU=GTE CyberTrust Solutions\, Inc.,O=GTE Corporation,C=US
  1. بر روی سرور دستور زیر را اجرا میکنیم:

$  orapki wallet add -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 -trusted_cert -cert /tmp/my-computer-certificate.crt

در این قسمت به جای نام my-computer-certificate.crt ، نام certificate کپی شده از client را قرار میدهیم.

با استفاده از دستور زیر بررسی میکنیم که نام client در لیست Trusted Certificates اضافه شده باشد:

$  orapki wallet display -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123

تغییرات فایلهای شبکه ای سرور

  1. تغییر فایلهای سرور:

در ابتدا خطهای زیر در فایل $ORACLE_HOME/network/admin/sqlnet.ora افاضه کنید و یا در صورت نیاز تغییر دهید:

WALLET_LOCATION =

   (SOURCE =

     (METHOD = FILE)

     (METHOD_DATA =

       (DIRECTORY = /u01/app/oracle/wallet)

     )

   )

SQLNET.AUTHENTICATION_SERVICES = (TCPS,NTS,BEQ)

SSL_CLIENT_AUTHENTICATION = TRUE

SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA)

SSL_VERSION = 1.0

سپس فایل $ORACLE_HOME/network/admin/listener.ora را بصورت زیر تغییر دهید:

SSL_CLIENT_AUTHENTICATION = TRUE

WALLET_LOCATION =

  (SOURCE =

    (METHOD = FILE)

    (METHOD_DATA =

      (DIRECTORY = /u01/app/oracle/wallet)

    )

  )

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = ol7-121.localdomain)(PORT = 1521))

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

      (ADDRESS = (PROTOCOL = TCPS)(HOST = ol7-121.localdomain)(PORT = 2484))

    )

  )

 

ADR_BASE_LISTENER = /u01/app/oracle

توجه داشته باشید در صورتی که ارتباط فقط باید با TCPS برقرار باشد ، خط TCP را حذف کنید.

سپس دستورات زیر را برای اعمال تغییرات انجام دهید:

$ lsnrctl stop

$ lsnrctl start

 

  1. تغییر فایلهای client:

فایل $ORACLE_HOME/network/admin/sqlnet.ora را در کلاینت اضافه کنید (توجه داشته باشید شما برای این مرحله میبایست oracle client را نصب داشته باشید).

WALLET_LOCATION =

   (SOURCE =

     (METHOD = FILE)

     (METHOD_DATA =

       (DIRECTORY = D:\app\oracle\wallet)

     )

   )

SSL_VERSION=1.0

SQLNET.AUTHENTICATION_SERVICES = (TCPS,NTS)

SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA)

SSL_CLIENT_AUTHENTICATION = TRUE

 

همچنین خطوط زیر را به فایل $ORACLE_HOME/network/admin/tnsnames.ora اضافه کنید:

pdb1_ssl=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCPS)
      (HOST=ol7-121.localdomain)
      (PORT=2484)
    )
    (CONNECT_DATA=
      (SERVER=dedicated)
      (SERVICE_NAME=pdb1)
    )
  )

در این قسمت میبایست pdb1_ssl را با نام دلخواه و pdb1 و ol7-121.localdomain را با توجه به نام سرور و نام سرویس در سرور تغییر دهید.

تست ارتباط:

برای تست ارتباط میتوان به صورت زیر عمل نمود:

 

c:\>sqlplus test/test@pdb1_ssl
SQL*Plus: Release 11.2.0.3.0 Production on Fri Jun 26 16:23:28 2015
Copyright (c) 1982, 2011, Oracle.  All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL>

به جای test باید کاربر موجود در سرور و پسورد قرار داده شود.

برچسب: Security,Database
Security - VPD COLUMN MASKINGدوشنبه , 27 آذر 1396 - حامد اسماعیلی-
موضوع: Database

 گرفتن دسترسی مشاهده دیتای چند ستون برای برخی از کاربران VPD COLUMN MASKING

صورت مسئله :

بدلیل حساس بودن دیتای موجود در یک ستون خاص ، میخواهیم کاری کنیم که در صورتی که تنها کاربران دارای مجوز مشاهده آن ستون به دیتابیس لاگین نمودند توانایی دیدن محتوای ستون مورد نظر را داشته باشند .

مراحل کار :

1- ایجاد یک تابع جهت تعریف کاربران مجاز

create or replace function VPD( p_owner in varchar2, p_name in varchar2 ) return varchar2
    as
    begin
            if sys_context( 'userenv', 'session_user' ) in( 'user1','user2') --and SYS_CONTEXT('USERENV','HOST')in('DOMAIN\TESTPC','hamed')
            and sys_context('userenv','ip_address') in ('192.168.1.10','192.168.1.20')
            then
                    return NULL;
            else
                   return '1=0';
            end if;
   end;
   /

2- ایجاد یک POLICY به شکل زیر

 BEGIN
         DBMS_RLS.ADD_POLICY(object_schema=>'scott',
                             object_name=>'test1',
                             policy_name=>'english_name_col',
                             function_schema=>'scott',
                             policy_function=>'VPD',
                             sec_relevant_cols=>'ENGLISH_NAME,DESCRIPTION',
                             sec_relevant_cols_opt=>dbms_rls.ALL_ROWS);
                           
    END;   /

با زدن SELECT زیر فقط کاربرانی میتوانند دیتای دو ستون فوق را مشاهده کنند که در تابع VPD اسامی آنها ذکر شده باشد

SELECT * FROM TEST1;  

برچسب: DB
Audit‌ کردن یک فیلد از جدولچهارشنبه, 15 آذر 1396 - سعید حسن پور-Saeed Hassanpour
موضوع: Database

 

Audit‌ کردن یک فیلد از جدول

حال اگر بخواهید که  log تغییرات بر روی یک فیلد از جدول را داشته باشید بصورت زیر عمل می کنید که با مثال آنرا بیان می کنم

 

1)
create table test_fga
(
  id number primary key,
  value number,
  name  varchar2(100)
);

insert into test_fga values ( 1, 1000, 'saeed');
insert into test_fga values ( 2, 2000 , 'armin');
commit;

2)
BEGIN
  DBMS_FGA.add_policy(
    object_schema   => 'TEST',
    object_name     => 'TEST_FGA',
    policy_name     => 'FGA_TEST_CHECK_VALUE',
    audit_column    => 'VALUE',
    statement_types => 'UPDATE');
END;
/

3)
update test_fga set name = 'ali'
where id= 1

4)
select session_id,timestamp,db_user,sql_text     from dba_fga_audit_trail;

هيچ ركوردی بازيابي نمي شود

 

 

5)
update test_fga set value = 1500
where id= 1

6)
select session_id,timestamp,db_user,sql_text     from dba_fga_audit_trail;

 Result:
update test_fga set value = 1500
where id= 1

7)
update test_fga set value = 1500, name = 'ali'
where id= 1

8)
select session_id,timestamp,db_user,sql_text     from dba_fga_audit_trail;

Result:
update test_fga set value = 1500, name = 'ali'
where id= 1

 

 

 

 

 

 

 

 

 

 

 

 

 

امیدوار هستم مورد استفاده دوستان قرار گیرد

 

اصلاح نمایش ترجمه پيغام های APEXسه شنبه , 30 آبان 1396 - سعید حسن پور-Saeed Hassanpour
موضوع: (Application Express (APEX

👇👇👇نکته:


در صورت مشاهده پيغام بدين صورت: 


<div dir="rtl">1 خطا رخ داده است</div>


 یا هر پیغام دیگر بايد از طريق زير آنرا اصلاح فرماييد: 

Shared Components > Translate > Text Messages


 اين دو Name را [FLOW.VALIDATION_ERROR, FLOW.SINGLE_VALIDATION_ERROR] جستجو كنيد و یا در پیغام های دیگر هم از همین طریق استفاده نمایید  و سپس تگ [<div dir="rtl"></div>] را از قسمت Text حذف كنيد. 

📌در نسخه قبل از APEX 5.1 قالب RTL ساپورت نشده بود. بدين منظور براي اينكه نمايش پيغام ها براي توسعه دهنده گاني كه از قالب LTR استفاده مي كردند و در ضمن در فايل هاي CSS خود تغييري مبني بر RTL كردن صفحات انجام نداده بود، اين تگ <div dir="rtl"> به بعضي از پيغام ها اضافه شده بود.

 📌حال دوستاني كه از نسخه APEX 5.1 و بالاتر را استفاده مي نمايند براي نمايش صحيح آنرا اصلاح کنید. 

 

IranAPEXCo

OracleAPEX_blog

 

ترجمه پيغام های فارسی نسخه APEX 5.1سه شنبه , 30 آبان 1396 - سعید حسن پور-Saeed Hassanpour
موضوع: (Application Express (APEX

📌در حال حاضر ترجمه نسخه APEX 5.1  بر روي سايت http://translate-apex.com قرار نگرفته است. براي دوستان اسكريپتي فراهم شده كه مي توانند از آن استفاده نمايند.

📌اين اسكريپت شامل تغييرات آخرين نسخه مي باشد.

📌دوستاني كه تا الان پيغام هاي خود را فارسي نكردند در ابتدا از طريق سايت http://translate-apex.com/apex/f?p=800:11 اسكريپت تهيه و اجرا و بعد از آن اسكريپت زير را اجرا نماييد.

📢مراحل اجراي اسكريپت ذيل به شرح زير مي باشد:


1- اسكريپت را دانلود كرده و از طريق يك اديتور آنرا باز و ويرايش نماييد

2-در داخل فايل متن MY_WORKSPACE_NAME را جستجو  و سپس نام workspace خود را جايگزين كنيد

3-در داخل فايل متن MY_APP_ID را جستجو  و سپس شماره/آي دي اپليكيشن خود را جايگزين نماييد

4- فايل را ذخيره كنيد و سپس وارد محيط APEX شويد.

5- وارد قسمت SQL Workshop> SQL Scripts شويد و سپس اسكريپت مربوطه را آپلود و بعد از آن اجرا نماييد.

6- تعداد 498 پيغام به پيغام هاي قبلي شما بايد اضافه شده باشد كه در مجموع تعداد 961 پيغام مي باشد

 

می توانید اسکرپیت مربوط به ترجمه APEX 5.1 فارسی را از کتابخانه سایت دانلود کنید.

 

👈👈اميدوار هستم كه مورد استفاده دوستان قرار گيرد و منتظر نظرات گرانبهاي شما هستيم👉👉

IranAPEXCo

OracleAPEX_blog

 

رفع مشکل Parse کردن کارکتر فارسی در XMLیکشنبه , 21 آبان 1396 - سعید حسن پور-Saeed Hassanpour
موضوع: Database

به احتمال زیاد هنگام خواندن فایل XML و Parse کردن در دیتابیس اوراکل، در صورتیکه شامل کارکترهای فارسی باشد برخورد کرده و با این خطا مواجه شده اید

 

بدلیل اینکه NLS_CHARACTERSET دیتابیس شما AR8MSWIN1256 می باشد به این خطا برخورد می کنید حال به روش زیر می توانید این خطا را برطرف سازید.

در ابتدا باید رشته XML را در یک BLOB ذخیره و سپس اقدام به خواندن مقدار XML نمایید

مثال:

 

—if NLS_CHARACTERSET = AR8MSWIN1256 in your database so you must use below code

    l_blob := FNC_CLOBTOBLOB (P_XML);

    Insert Into TAXML_TEMP (F_XML) Values (XMLTYPE(l_blob,Nls_Charset_Id('UTF-8')));  

 

  —if NLS_CHARACTERSET = UTF-8 or AL32UTF8 so you should use below code

  Insert Into TAXML_TEMP (F_XML) Values (XMLTYPE(P_XML));


 

 

 

 

 

 

 

می توانید اسکرپیت جدول و پکیج را از کتابخانه سایت دانلود کنید.

 

بعدیبعدی