![]() | ||
![]() |
![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||
|
Najczęstsze problemy i pytania związane z otwartą architekturą metadanych SAS® 9 Poniżej zamieszczono najczęstsze problemy i pytania pojawiające się przy pracy z otwartą architekturą metadanych, a zwłaszcza z serwerami aplikacji, oraz sposoby ich rozwiązania. Komunikaty mogą się trochę różnić w zależności od systemu operacyjnego, zainstalowanego service packa, jednakże przyczyny problemów są w większości przypadków te same. Instalacja i konfiguracja
Serwer metadanych
Object spawner
Workspace serwer
Stored Process serwer
OLAP serwer
Instalacja i konfiguracja
Rozwiązanie: Konfigurator można uruchomić bezpośrednio z płytki "SAS Configuration and Management" (config1cd). Konfigurator akceptuje kilka parametrów wejściowych:
Rozwiązanie: Skrypty, które są wykonywane, wykorzystują jary z SAS Management Console, stąd konieczność zdefiniowania ścieżki wskazującej na katalog instalacyjny konsoli. Jeżeli konsola nie jest zainstalowana, ścieżka nie jest zdefiniowana lub wskazuje na inny katalog to żaden skrypt nie będzie działał. Jeżeli konsola jest zainstalowana, to należy sprawdzić w pliku <środowisko>Levx\Utilities\MetadataDeployment\bin\loadMetadata.bat jaka wartość jest przypisywana zmiennej SASMCROOT. Zmienna ta powinna wskazywać na ścieżkę, w której zainstalowana jest konsola. Jeżeli konsola nie jest zainstalowana, to należy ją zainstalować.
Z menu Start wybrać Programy --> SAS --> SAS 9.1 Utilities --> Odnów programy SASowe. Ten sam program można uruchomić z katalogu !SASROOT\core\sasinst\sasrenew\sasrenew.exe lub z płytki instalacyjnej Software Disk 1 CD (disk1) z katalogu \sas\core\sasinst\sasrenew\sasrenew.exe (należy mieć uprawnienia pozwalające na modyfikację plików w !SASROOT) Z katalogu !SASROOT uruchomić sassetup, wybrać Run Setup Utilities, a następnie Renew SAS Software. Serwer metadanych
ERROR: The tcpSockRead call failed. The system error is
'The connection was reset by a peer.'.
NOTE: Bridge protocol engine socket access method failed to read from socket,
error 10054 (The connection was reset by a peer.).
Client connection (2) closed.
Nie jest to błąd, ale informacja, że klient odłączył się od serwera metadanych bez powiadomienia serwera.
(SN-12210).
Windows: w pliku konfiguracyjnym <środowisko>\Levx\SASMain\MetadataServer\sasv9_MetadataServer.cfg. UNIX: w komendzie startowej serwera metadanych <środowisko>\Levx\SASMain\MetadataServer\MetadataServer.sh. Domyślnie log jest umieszczany w katalogu <środowisko>\Levx\SASMain\MetadataServer\logs. Zawiera on informacje m.in. o połączeniach użytkowników z serwerem metadanych. Ilość informacji, która jest wypisywana w logu serwera metadanych, można zwiększyć korzystając z parametrów podawanych przy starcie serwerów IOM: Parametry te podawane są w opcji OBJECTSERVERPARMS w pliku konfiguracyjnym serwera metadanych (Windows) lub w instrukcji uruchamiającej serwer (UNIX). APPLEVEL - wypisywanie w logu dodatkowych informacji związanych z autentykacją klientów IOMLEVEL - wypisywanie w logu komunikatów XML przesyłanych do i z serwera. W przypadku tej opcji dobrze jest również dodać opcje jnlStrMax=10000 jnlLineMax=10000, dzięki którym zapisany zostanie pełny kod XML. PELEVEL - zdarzenia związane z protokołem komunikacyjnym i przesyłanymi pakietami.
Rozwiązanie: Serwer metadanych rozpoznaje użytkowników na podstawie pełnego identyfikatora. Dlatego jeżeli w metadanych definiowany jest użytkownik Windows, w Loginie tworzonym dla niego powinien być wpisany pełny identyfikator (nazwa_maszyny\ident lub domena_Windows\ident).
Rozwiązanie: Obiekty typu Login w metadanych są dodatkowo zabezpieczane przed dostępem. Każdy użytkownik może oglądać tylko Loginy, które zostały zdefiniowane dla niego oraz dla grup, do których należy. Jedynie użytkownik typu "unrestricted" ma dostęp do wszystkich Loginów (ale i tak nie może przeczytać żadnego hasła).
Rozwiązanie: Wszyscy użytkownicy specjalni wymagani przez konfigurator mogą być zarówno użytkownikami lokalnymi jak i użytkownikami domenowymi, choć użytkownicy sasadm, sastrust i saswbadm są autentykowani tylko przez maszynę, na której działa serwer metadanych, więc nie ma potrzeby definiowania ich jako użytkowników domenowych.
Rozwiązanie: Każdy serwer SASa do autentykacji wykorzystuje zewnętrzne narzędzia. Domyślnie są to narzędzia systemu operacyjnego (host authentication). Jeżeli w ramach systemu operacyjnego został zdefiniowany alternatywny mechanizm autentykacji (np. Active Directory), wówczas wszystkie serwery SASa będą mogły z tego mechanizmu skorzystać bez konieczności ustawiania żadnych dodatkowych opcji (z punktu widzenia SASa będzie to nadal host authentication). Dodatkowo serwer metadanych i OLAP serwer mogą korzystać z zewnętrznej autentykacji (LDAP, AD) bezpośrednio.
Rozwiązanie: Jeżeli LDAP (AD) nie został skonfigurowany jako alternatywny mechanizm autentykacji dla systemu operacyjnego, można go zdefiniować jako sposób autentykacji dla serwera metadanych i serwera OLAP. Opcja -AUTHPROVIDERDOMAIN serwera metadanych (podana w pliku konfiguracyjnym serwera lub w instrukcji uruchamiającej) pozwala zdefiniować, jak będzie wykonywana autentykacja użytkowników: -authproviderdomain provider:domain | (provider-1:domain-1<, . . .provider-n:domain-n>)gdzie provider może przyjmować następujące wartości: ADIR autentykacja będzie przeprowadzana w oparciu o Active Directory HOSTUSER autentykacja będzie wykonywana w oparciu o system operacyjny; w tej opcji można podać domenę Windows LDAP autentykacja będzie wykonywana przez serwer LDAP Dodatkowo w systemie muszą być ustawione odpowiednie zmienne środowiskowe. Szczegóły można znaleźć na stronie Implementing Alternative Authentication Providers.
-authproviderdomain (ADIR:thisDomain)przy próbie uruchomienia serwera może pojawić się komunikat:
0403-057 Syntax error at line 42 : '(' is not expected.
Rozwiązanie: Na UNIXie przed znakami '(' lub ')' może być konieczne dodanie '\' przed nawiasami.
Definicja użytkowników w metadanych jest również wymagana przez niektóre aplikacje W celu synchronizacji użytkowników w metadanych z LDAPem (AD) można wykorzystać makra dostarczane z Systemem SAS. Ich opis znajduje się w SAS 9.1.3 Intelligence Platform: Security Administration Guide, w rozdziale "Bulk-Load Processes for Identity Management".
ERROR: Access denied.Authentication failed.Rozwiązanie: Taki błąd na ogół spowodowany jednym z 2 powodów:
Error: No such name found.
New client connection rejected from server port 8561 for user user@ldapdomain
Rozwiązanie:
Taki komunikat pojawia się, kiedy nie zostały zdefiniowane zmienne środowiskowe niezbędne do połączenia z LDAPem
(AD) - szczegóły można znaleźć w nocie
SN-15258.
Rozwiązanie: Każdy użytkownik może zmienić hasła zdefiniowane w metadanych dla siebie oraz dla grup, do których należy (o ile ma odpowiednie uprawnienia w metadanych), wykorzystując: Wszystkie hasła w metadanych zdefiniowane dla użytkowników i grup może również zmieniać użytkownik unrestricted (domyślnie sasadm). Dla użytkowników standardowych, wymaganych przez konfigurator (sasadm, sastrust, sasguest itd.) hasła powinien zmieniać administrator. Należy przy tym pamiętać, że hasła niektórych standardowych użytkowników są zapisane w metadanych, jak również w niektórych plikach konfiguracyjnych związanych ze środowiskiem SAS 9. Hasła w plikach konfiguracyjnych są wpisane w postaci zaszyfrowanej. Hasła można zaszyfrować używając w SASie procedury PWENCODE:
proc pwencode in='hasło' method=sasenc|sas001;
run;
Zaszyfrowane hasło wyświetlone będzie w logu. Należy przepisać pełny tekst.
Szczegółowe informacje, w tym lista plików z hasłami, znajdują się w SAS 9.1.3 Intelligence Platform: Security Administration Guide, w rozdziale "User ID and Password Management".
LIBNAME ora ORACLE PATH=sasora9 USER=oratest PASSWORD=XXXXXXXXXXXXXXXXXXXXXX ; ERROR: ORACLE connection error: ORA-01017: invalid username/password; logon denied. ERROR: Error in the LIBNAME statement.Instrukcja LIBNAME wyświetlana w SAS Management Console ma postać:
LIBNAME ora ORACLE PATH=sasora9 USER=oratest PASSWORD="{sas001}KioqKioqKio=" ;
Rozwiązanie: Zakodowane hasło "KioqKioqKio=" to zakodowany ciąg 8 gwiazdek. Gwiazdki są zwracane, gdy
zalogowany jest użytkownik "unrestricted" (domyślnie sasadm). Nie ma on dostępu do haseł użytkowników.
Rozwiązaniem problemu jest zalogowanie się na użytkownika, który nie jest "unrestricted" i który ma dostęp
do wykorzystywanego loginu (jest członkiem grupy oratest).
Oprócz autentykacji przez system operacyjny jedynie serwer metadanych oraz serwer OLAP mogą bezpośrednio wykorzystywać zewnętrzne mechanizmy autentykacji - LDAP, Active Directory. Dokładny opis, jakie opcje należy w tym przypadku ustawić, znajduje się m.in. w Security Administration Guide. Jedynym sposobem na skonfigurowanie środowiska na UNIXie w taki sposób, żeby wszystkie serwery SAS autentykowały przez LDAP lub AD, jest skonfigurowanie modułu PAM (Pluggable Authentication Modules), który pozwala na zdefiniowanie LDAP lub AD jako alternatywnego mechanizmu autentykacji dla systemu operacyjnego. Aby skonfigurowany moduł PAM mógł być wykorzystany przez SAS, potrzebne jest zainstalowanie odpowiedniego hot fixa. Informacje, który hot fix będzie odpowiedni i skąd go ściagnąć, można uzyskać w Dziale wsparcia technicznego. Szczegółów na temat konfiguracji PAMa należy szukać w dokumentacji dla danego systemu operacyjnego. Uwaga!!! Bezpośrednie użycie LDAP czy AD nie zwalania administratora środowiska z utrzymywania użytkowników w metadanych. Jest to konieczne m.in. do autoryzacji użytkowników oraz do umożliwienia mechanizmu single sign-on. Jest to również wymagane przez niektóre aplikacje.
Problem jest następujący: W metadanych zdefiniowana jest biblioteka B wskazująca na jakiś folder na serwerze X. W sesji SASa uruchomionej na innym komputerze definiowana jest biblioteka z enginem META, wykorzystująca definicję biblioteki B z metadanych. Dlaczego taka kombinacja nie zadziała? Engine META działa w następujący sposób: Jak w związku z tym dostać się jednak do danych z innego komputera? Trzeba zdefiniować mechanizm, który te dane będzie udostępniać, czyli na serwerze X musi być uruchomiona jakaś sesja SASa, na której instrukcja LIBNAME będzie wykonywana. Ta zdalna sesja będzie widziała zdefiniowaną ścieżkę lub miała dostęp do danych zewnętrznych i będzie te dane udostępniała. Może to być zrealizowane poprzez serwer SAS/SHARE, który będzie udostęniał biblioteki zdefiniowane w metadanych. Innym sposobem jest wykorzystanie SAS/CONNECT, w tym przypadku jednak należy pamiętać, że sesja SAS/CONNECT musi zostać wcześniej uruchomiona, co nie jest wykonywane automatycznie. W obu przypadkach lokalnie trzeba zdefiniować zdalną bibliotekę (poprzez engine REMOTE). Object spawner
Rozwiązanie: Log object spawnera można zdefiniować wybierając jeden z następujących sposobów: Na UNIXie skrypt startujący object spawner znajduje się w <środowisko>/Levx/SASMain/ObjectSpawner/ObjectSpawner.sh. Na Windows należy zmodyfikować plik <środowisko>\Levx\SASMain\ObjectSpawner\ObjectSpanwer.bat. Jeżeli object spawner jest uruchamiany ręcznie, wówczas należy zmodyfikować komendę w sekcji START2 i zrestartować object spawner. Jeżeli object spawner jest uruchamiany jako usługa, należy zmodyfikować komendę w sekcji INSTALL i ponownie zainstalować object spawner jako usługę.
ERROR: An attempt to communicate with the SAS Metadata Server failed.Rozwiązanie: Błąd ten świadczy o tym, że object spawner nie mógł połączyć się z serwerem metadnych. Do połączenia object spawner wykorzystuje informacje w pliku <środowisko>\Levx\SASMain\ObjectSpawner\OMRconfig.xml. Należy sprawdzić, czy podano w nim:
ERROR: A valid sasSpawner definition cannot be found.
ERROR: Objspawn encountered errors during results processing.
lub
ERROR: Objspawn was unable to locate a server definition. Objspawn
is exiting.
Rozwiązanie:
Na początku logu object spawnera pojawia się nazwa maszyny, na której jest uruchamiany object spawner. Nazwa ta
powinna być taka sama, jak nazwa maszyny dla object spawnera w metadanych
ERROR: The parsing of the metadata results failed.
20070202:15.10.41.85: 00000003:ERROR: The load balancing instance
ldblCompRefSetMetadata call failed.
Rozwiązanie: W definicji object spawnera w metadanych nie został wybrany żaden serwer uruchamiany przez
ten object spawner.
The specified address is already in use.Sprawdzono, że porty zdefiniowane dla object spawnera nie są zajęte. Rozwiązanie: Prawdopodobnie w definicji object spawnera w metadanych wybrano 2 serwery działające na tym samym porcie. Workspace serwerWorkspace serwer jest startowany przez object spawner, który komendę startującą serwer wczytuje zaraz po uruchomieniu. Dlatego każda modyfikacja workspace serwera w metadanych wymaga restartowania object spawnera.
Rozwiązanie: Log dla workspace serwera można dodać dopisując opcje -log i -logparm do instrukcji uruchamiającej workspace serwer (w opcjach workspace serwera w metadanych) lub wpisując do pliku konfiguracyjnego i wskazując go przy uruchamianiu serwera. Należy przy tym stworzyć osobny plik konfiguracyjny, gdyż z domyślnego pliku konfiguracyjnego (<środowisko>\Levx\SASMain\sasv9.cfg) korzystają wszystkie serwery. Nazwa pliku powinna być tak zdefiniowana, żeby dla każdego użytkownika była inna. W przeciwnym przypadku procesy będą starały się pisać do 1 pliku, co może skończyć się błędami. W środowisku produkcyjnym nie jest wskazane zapisywanie logów workspace serwera (ze względów wydajnościowych - w krótkim czasie mogą zająć dużo miejsca).
ERROR: An unexpected error has prevented transfer
of handles between processes
Rozwiązanie: Taki komunikat na ogół świadczy o tym, że nie udało się wystartować SASa. Należy więc
sprawdzić:
Problem: Domyślnie zadania uruchamiane w DI Studio czy w Enterprise Guide'zie wyświetlają log tylko w ramach aplikacji, natomiast nie zapisują go do pliku, nawet jeżeli workspace serwer jest startowany z opcją -log. Podobnie dzieje się w przypadku procesów gotowych uruchamianych na workspace lub stored process serwerze. Rozwiązanie: W celu otrzymania w logu informacji o wykonywanym kodzie należy w definicji serwera w polu Object Server Parameters dodać opcję applevel=3. Spowoduje to wypisywanie do logu wielu dodatkowych informacji, miedzy innymi logu wykonywanego zadania. Uwaga! Zmiana definicji serwera w metadanych wymaga restartu object spawnera. Dla stored process serwera log jest zdefiniowany domyślnie, natomiast w przypadku workspace serwera plik, w którym będzie zapisywany log, należy zdefiniować samemu. Można to zrobić w definicji serwera w komendzie uruchamiającej serwer lub w configu stworzonym dla workspace serwera. Należy jednak pamiętać, że każda sesja workspace serwera powinna mieć swój log. Próba uruchomienia dwóch sesji, które będą miały wspólny log może prowadzić do różnych błędów. Przykładowo log można zdefiniować dodając do komendy uruchamiającej serwer następujące opcje: -log "C:\sas\Lev1\SASMain\WorkspaceServer\logs\test_%H%M%s.log" Wówczas nazwa logu będzie zawierać dokładny czas uruchomienia serwera (przy założeniu, że dwie sesje serwera nigdy nie zaczną się w tej samej sekundzie) lub -log "c:\sas\Lev1\SASMain\WorkspaceServer\logs\WorkspaceServer_%v.log" W tym przypadku każdy log będzie miał swój unikalny numer. Uwaga! W środowisku produkcyjnym definiowanie logu dla workspace serwera nie jest zalecane. Liczba plików może w krótkim czasie być bardzo duża i mieć negatywny wpływ na wydajność systemu. Również ustawianie opcji applevel=2 lub 3 w środowisku produkcyjnym nie jest wskazane ze względu na rozmiary tworzonych plików.
Problem: Domyślnie środowisko zostało tak skonfigurowane, żeby użytkownicy nie mieli możliwości wykonywania poleceń systemu operacyjnego z programów SAS.
WARNING: Shell escape is not valid in this SAS session. Przy użyciu opcji PIPE w instrukcji FILENAME pojawi się błąd: ERROR: Insufficient authorization to access PIPE. Rozwiązanie: Takie zachowanie można zmienić ustawiając następujące opcje, które pozwalają na wykonywanie poleceń systemu operacyjnego: opcję allowxcmd przy starcie object spawnera opcje xcmd i noxwait przy starcie workspace serwera (UNIX - tylko opcja xcmd) Po wprowadzeniu tych zmian konieczny jest restart object spawnera. W przypadku, gdy object spawner działa jako usługa na Windows, konieczne jest jego ponowne zainstalowanie. W przypadku, gdy workspace serwer działa na Windows 2003 Server, mogą być konieczne jeszcze dodatkowe ustawienia (Nota SN-13521 ).
W większości instalacji systemu Windows Active Directory jest zdefiniowany jako alternatywny sposób autentykacji użytkowników. W przypadku systemu UNIX również można taki sposób autentykacji zdefiniować, korzystając z mechanizmu Pluggable Authentication Module (PAM). Rozwiązanie to wymaga dodatkowych wpisów w pliku /etc/pam.conf (szczegóły w nocie SN-16861) oraz hot fixa do SASa. Stored process serwerStored process serwer jest startowany przez object spawner, który komendę startującą serwer wczytuje zaraz po uruchomieniu. Dlatego każda modyfikacja stored process serwera w metadanych wymaga zrestartowania object spawnera.
Na UNIXie domyślnie uruchamiany jest skrypt: <środowisko>/Levx/SASMain/StoredProcessServer/sas_SPS.sh Plik konfiguracyjny domyślnie znajduje się w: (Windows) <środowisko>\Levx\SASMain\StoredProcessServer\sasv9_StorProcSrv.cfg (UNIX) <środowisko>/Levx/SASMain/sasv9.cfg
ERROR: This server cannot be spawned without credentials which specify the server process username.Rozwiązanie: Taki komunikat na ogół świadczy o tym, że metadane o serwerze nie zostały poprawnie zdefiniowane. Jeżeli stored process serwer nigdy nie działał, należy sprawdzić w metadanych:
sam.S251.ex.msg: A problem occurred while connecting to a load balancing spawner. Check the spawner log for more details.A w logu object spawnera: Error authenticating user userid in function LogonUser. Error 1326 (Logon failure: unknown user name or bad password. ). ERROR: Access denied. ERROR: Failed to launch the server (A5MID0O6.AV000002) on behalf of load balancing.Rozwiązanie: Problem ten pojawia się wtedy, gdy podano niepoprawny identyfikator lub hasło użytkownika, w imieniu którego będzie startowany stored process serwer (domyślnie sassrv). W takim przypadku należy sprawdzić:
Rozwiązanie: Na to czy w logu stored process serwera będzie się pojawiać log z wykonania procesu gotowego ma wpływ opcja APPLEVEL. Domyślnie ma wartość 1, co powoduje zapisywanie logu z procesu do logu stored process serwera tylko wtedy, kiedy przetwarzanie zakończy się błędem. Ustawienie tej opcji na 2 powoduje, że zostanie zapisany log każdego procesu gotowego, niezależnie od tego, czy proces zakończył się błędem czy nie. Opcję tę podaje się we właściwościach stored process serwera w polu Object Server Parameters.
Rozwiązanie: Tak. Stored process serwer jest uruchamiany w imieniu użytkownika sassrv, ale autentykuje każdego użytkownika, który chce uruchomić procesy gotowe. Jeżeli użytkownik nie zostanie zautentykowany przez system operacyjny, nie będzie mógł uruchomić procesu gotowego.
W większości instalacji systemu Windows Active Directory jest zdefiniowany jako alternatywny sposób autentykacji użytkowników. W przypadku systemu UNIX również można taki sposób autentykacji zdefiniować, korzystając z mechanizmu Pluggable Authentication Module (PAM). Rozwiązanie to wymaga dodatkowych wpisów w pliku /etc/pam.conf (szczegóły w nocie SN-16861) oraz hot fixa do SASa. OLAP serwer
Plik konfiguracyjny OLAP serwera: (Windows) <środowisko\Levx\SASMain\OLAPServer\sasv9_OLAPServer.cfg (UNIX)<środowisko/Levx/SASMain/sasv9.cfg
ERROR: The tcpSockRead call failed.
The system error is
'The connection was reset by a peer.'.
NOTE: Bridge protocol engine socket access method
failed to read from socket, error 10054
(The connection was reset by a peer.).
W logu serwera metadanych:
ERROR: Requesting connection is not trusted.Rozwiązanie: Użytkownik wykorzystywany do połączenia z serwerem metadanych (domyślnie sastrust) nie został zdefiniowany jako "trusted user". Użytkownik ten jest podawany w configu OLAP serwera (<środowisko>\Levx\SASMain\OLAPServer\sasv9_OLAPServer.cfg) lub w skrypcie startującym OLAP serwer (<środowisko>/Levx/SASMain/OLAPServer/OLAPServer.sh). Inną przyczyną jest wystartowanie serwera OLAP na koncie roota - nota SN-15554.
ERROR: Invalid physical name.Rozwiązanie: Nie jest to błąd tylko komunikat, który pojawia się, gdy przy starcie serwera nie jest podany autoexec. Nota SN-012174.
Rozwiązanie: Prawdopodobnie przyczyną jest brak uprawnień użytkownika w metadanych. Użytkownik nie ma uprawnienia ReadMetadata (w defaultACT, w schemacie, do którego należy dany serwer lub w serwerze aplikacji, w ramach którego jest zdefiniowany OLAP serwer). Brak uprawnień może wynikać z przynależności do grupy, której te uprawnienia odebrano.
Rozwiązanie: Taka sytuacja może się zdarzyć, kiedy użytkownik, na którego jest startowany OLAP serwer, nie ma dostępu do fizycznych plików kostki.
W module nie są dostępne żadne danelub Invalid cube. No dimension found in this cube.Rozwiązanie: Użytkownik, który będzie wyświetlał dane z kostki, musi mieć ustawione prawo ReadMetadata i Read. Taki komunikat wskazuje na to, że prawdopodobnie nie ma on prawa Read.
Rozwiązanie: Serwer OLAP może do autentykacji wykorzystywać mechanizmy systemu operacyjnego, LDAP lub AD. Opcje, które należy w tym celu zdefiniować, są takie same, jak w przypadku serwera metadanych (zobacz Jak zdefiniować inny sposób autentykacji).
Exception occured while attempting to acccess data (Metadata error - The specified metadata repository or schema does not define any cubes).Kostka nie jest widoczna w EG. Rozwiązanie: W pliku konfiguracyjnym OLAP serwera brakuje opcji METAREPOSITORY definiującej repozytorium, w którym znajduje się kostka. W pliku konfiguracyjnym należy zdefiniować: -METAREPOSITORY "Nazwa_Repozytorium_Custom"
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||
| Skontaktuj się z nami | Szukaj | Terms of Use & Legal Information | Privacy Statement | Copyright © 2003 SAS Institute Inc. All Rights Reserved |