2016-04-08 21 views
0

Aşağıdaki kod Oracle veritabanında tüm standart şifreleri değiştirmek için parola ifadeleri değiştirmek üretir "hükmü burada" uygun buluyorum. 12.1.0.2.0 sürümünde, onu geçersiz Şifre değerlerine değiştirmek artık mümkün değildir. Bu yüzden bu anahtar kasası yapısını oluşturmam gerekiyordu. Kurbağa sonunda birleştirme yapısı üzerinde bir uyarı (kural 5807) verir. “Kartezyen sorgulardan kaçının - bir fıkra kullanın ...” diyor. Tüm Oracle veritabanı sürümlerinde çalışan bir “where clause” ile ilgili herhangi bir Fikir?kartezyen sorguları kaçının -

SET TERMOUT OFF 
SET ECHO  OFF 
SET LINESIZE 140 
SET FEEDBACK OFF 
SET PAGESIZE 0 

SPOOL user.sql 

SELECT 'alter user ' 
     || username 
     || ' identified by values ' 
     || CHR (39) 
     || CASE 
      WHEN b.version = '12.1.0.2.0' THEN '462368EA9F7AD215' 
      ELSE 'Invalid Password' 
      END 
     || CHR (39) 
     || ';' 
    FROM DBA_USERS_WITH_DEFPWD a, 
     (SELECT DISTINCT version 
      FROM PRODUCT_COMPONENT_VERSION) b; 

SPOOL OFF 
@user.sql 
+0

Her kullanıcı her ürün bileşeni sürümü için sorgu tarafından döndürülen bir kayıt gerekiyor mu? Yoksa iade edilmek istemediğiniz kombinasyonlar var mı? –

+0

(SQL 92 standartlarına sorguyu yeniden organize konusunda oldukça doğru ifadeden kenara) herhangi bir yükü eklemez basit yolu, eklemektir "where 1 = 1" sorguya. –

cevap

1

tablo PRODUCT_COMPONENT_VERSION DÖRT satırları değil, birine sahiptir. Oracle Database ve PL/SQL dahil olmak üzere farklı ürünler için sürümler vardır. Makinemde, sürüm dört satırda aynıdır, ancak bunun neden genel olarak beklenilmesi gerektiğini anlamıyorum. bunlar farklı olabilir Eğer sadece bir satır dönmek çünkü

, İLK sen bir sorunu size haç anlatmak Tüm cevapları katılmak olduğunu göz ardı edebilirsiniz. Yapmıyorsun; Birden fazla satır döndürebilirsiniz. İKİNCİ, sorgunuzun kendisinde, neden sadece Oracle Database'in sürümü değil, PRODUCT_COMPONENT_VERSION dizisinin TÜM satırlarından geri dönüyorsunuz?

'un çalışması gerektiğini düşünüyorum - ve SELECT deyimine DISTINCT gerekmeyecektir. İyi şanslar!

+0

Bu iyi bir fikir - başka bir örnek: 'WHERE UPPER (ürün) LIKE '% DATABASE%' – r0tt

2

Toad basitçe size bir hayır JOIN koşulları ile katılmak yapıyoruz gerçeği hakkında bir uyarı veriyor. Bu durumda , bunu gerçekten yapıyor ama lgili örgütler biri (PRODUCT_COMPONENT_VERSION gelen sorgu) yalnızca bir değer döndürmesi gerekir, böylece sorun sahte biridir. Sadece 1 elementi olan bir kartezyen yapıyorsunuz, bu yüzden bir kartezyen, ama değerlerinizi çarpmıyor,

0

Tüm kullanıcı ve ürün bileşenleri kombinasyonlarına ihtiyacınız varsa, kartezyen ürün doğru seçim. Dosyaya potansiyel olarak yazılabilen satırların sayısını göz önünde bulundurun (kullanıcılar * bileşen sürümleri). Muhtemelen bir çeşit harmanlamaya ihtiyacın var. Aksine eski sözdizimi katılmak kullanmaktan daha (a katılmak koşulu olmadan - Ne Kara kurbağası hakkında uyarıda bulunuyor ise)

1

sen (ANSI/ISO) SQL-92 sözdizimi katıl ve açıkça katılmak belirtmektedirler kullanabileceği bir CROSS JOIN geçerli:

ancak o zaman satır sayısını artırmaz tek bir satır döndürür katıldı ikinci tablo döndü yana
SELECT 'alter user ' 
     || username 
     || ' identified by values ' 
     || CHR (39) 
     || CASE 
      WHEN b.version = '12.1.0.2.0' THEN '462368EA9F7AD215' 
      ELSE 'Invalid Password' 
      END 
     || CHR (39) 
     || ';' 
    FROM DBA_USERS_WITH_DEFPWD a 
     CROSS JOIN 
     (SELECT DISTINCT version 
      FROM PRODUCT_COMPONENT_VERSION) b; 

ve CROSS JOIN bir katılmak durum (yani umarım Toad şikayet gereksiz duracaktır) beklememektedir.

Biraz daha verimli sürümü (dahil olmayan birçok satır olmadığından ancak minimal) kullanmak olacaktır:

SELECT version FROM PRODUCT_COMPONENT_VERSION WHERE ROWNUM = 1 

Sonra Oracle sıralarından sonra tablodan okuma durdurabilir ve yok DISTINCT işlemini gerçekleştirmek için. Benim makinede (Oracle serbest XE sürümü ile bir dizüstü bilgisayar - mümkün olan en basit düzenleme) Açık