OBIEE: Evaluate
I haven't had a whole lot of opportunities to use this function. It's actually so rare, that I forget how to use it. In the fine tradition of documenting everything, here I go. Evaluate Syntax: EVAULATE('your db function(%1,%2)', parameter list)The reason I need to use it is because we are removing a view that has some fun SUBSTR/INSTR action in it. I tried writing it up in OBIEE SQL, but it doesn't allow you to traverse from the end of the string...well, someone out there probably could, but I like to limit this kind of thing in the RPD, preferring instead to put it in the database. As much as we'd like to believe it, OBIEE will not be the only application accessing this data. But I digress. Here's the original Oracle SQL: SUBSTR( col1, INSTR( col1, '/', -1 ) + 1 ) Which reminds me of something else...there is no real way to test this stuff in the admin tool (RPD). You have to create it there and then create an ad-hoc report to make sure it's working as it should. Rather than deal with that, I just started in Answers. First go: EVALUATE( 'SUBSTR( %1, INSTR( %1, '/', -1 ) + 1 )', '/TESTING/TESTING1/TESTING2/REPORT_NAME' ) This resulting in the following when I hit OK:  OK, my bet is that those single quotes inside the single quotes were the cause. So I tried variations of 2 single quotes, 3 single quotes and even double quotes. None of those worked either. What if I just put that '/' in the parameter list? EVALUATE( 'SUBSTR( %1, INSTR( %1, %2, -1 ) + 1 )' , '/TESTING/TESTING1/TESTING2/REPORT_NAME', '/') Voila! Yay for me. Labels: answers, howto, obiee, oradb, rpd
Customer Service
Recently, I received a message via LinkedIn from a Product Manager at Oracle. I won't say who, just because I wouldn't want to get them into any trouble. The email was fairly general, mostly asking if I had used their product and if I had any questions. Well, I hadn't used that particular product, but I did have questions as it falls into my DW/BI realm. So I sent my questions. Within a day or so, I had this long, very detailed description about the differences between the 2 products and why one would choose one over the other (both products were Oracle products). It also included customer examples (sans customer names of course) of who is choosing what and when. I love these kinds of exchanges. I love having the ability to ask questions of people who manage products because you get real insight into how they are thinking. I believe this speaks volumes for this individual specifically and Oracle in general. I know Oracle isn't perfect by any means, but what company of that size is? This person wanted to make sure that I was informed, reached out to me, and provided me with the answer to my questions. I certainly wish there were more people like this (not just at Oracle). After having sat in on an Exadata PoC, I can appreciate it that much more since I never get to spend the money. So thank you anonymous Oracle employee, you set a good example for quite a few people. Labels: oracle, oradb
Google Is Stalking Me
Last week I was doing some research on buy vs. leasing a server/workstation. Ultimately, I decided to buy one, this one.  I bought it because Amazon was just too expensive (for my purposes) and so was collocating a server (I wanted something a little more beefy than normal). I wasn't about to pay $1000 a month. During that research, I made it to Storm website (on demand hosting). I'm not sure if I actually clicked on an advertisement on the result page of my Google search or what...but now they are everywhere. I went to 4 sites today, and here's what I found: wunderground.com forum.xda-developers.com somethingawful.com linuxquestions.org addictivetips.com factmag.com It's just a tad creepy, but I may be to blame for click on an advertisement (still unsure). Anyone out there experience something like this before? Labels: funny, google
katezilla: staying positive
It's the eve (well, morning) of our second evaluation of the year. Our first was with The Tridas Center and I don't believe either one of us thought it went that great. They took our $1000 and regurgitated the history of Kate that we had given them. They told us things we wanted to hear. They said she was not autistic and that she didn't have PDD (pervasive development disorder)...it was great to hear that. But with some time to reflect we've come to believe it was a bit of a scam. I do believe the Center does good things for other people, but not us. Not Kate. The result of that visit was behavioral, (more) occupational, and of course speech therapy. I can't say we've seen much improvement. That's a difficult thing to say, but for me, it hit home this weekend. Kate, at times, is on the verge of unmanageable. Kris has known this for some time...of course. I don't think I was ignoring anything, I just never saw it the way she did. I'm not convinced things are moving in the right direction. Don't get me wrong...I love this little girl more than I ever thought possible. I do have to face a reality...at some point in time. Jaded. Hurt. Confused. Sad. Depressed. I'm sure I could think of a million words to describe our collective mindset. I've tried to be the optimist. Always the optimist. If you know me, you'll know that is just who I am. It's just getting harder and harder to do. We will not go into tomorrow's evaluation as blindly as we did the first. We may go in with a giant chip on our shoulder. Who knows? Both of us just want, some sort of answer. There is someone home in the tiny little body, we just need to figure out how to access it. Labels: family, kate
DDL Auditing - Revisited
Of course I can't find the post(s) that I read recently, but they were all concerning auditing DDL. The most desirable solution is to use the built in auditing providing by Oracle...the only problem with auditing, in general, is that no one really monitors it. I'm sure there are numbers out there (read about that too, but can't seem to find the post). Oh wait, I found it, it was a video that I got via the Database Insider newsletter. You can see it here. The gist of that video (as cheesy as it may be), is that some broker figures out a way to submit trades with his account that don't really exist. He's paid the commission, automatically, some $10 million. The Risk/Security Officer talks about the amount of time (months) they spent trying to track down how it was done. They were at least smart enough to have auditing turned on, however, they never monitored it. Somehow, all this led me to DDL auditing. No idea how, it just did. After thinking about it for a few days, I realized the similarity between that and my PMDV project I did last year. It only made it to version 0.1, but this gave me the idea to revisit it. Maybe it was just poor naming/branding (PMDV stands for Poor Man's Data Vault)? Maybe it did just suck eggs? Tough to say for sure. To sum it up quickly, it required a "ticket number" or "work order" to set an application context. Without that application context set, you could not perform any DDL. On top of that, it would record all the DDL changes performed during that deployment window and give you decent reporting through an APEX front end. Like I said in one of those other posts, a former company of mine had to provide the security team with audit reports for each deployment. While the built-in auditing would capture all this, what I created will at least capture that in one place and provide the objects that change. So perhaps this falls into the Change Management landscape (which is on my radar again...big, big topic). Guess what, I just remembered how I came to remember this...a conversation on Twitter with @hillbillytoad and @krisrice...that's what led me to the DDL trigger and auditing. I think Kris suggested that a DDL trigger should be installed to prevent little old me from doing damage. :)  That link led to here and then a few other places... Labels: ddl, oradb, pmdv, triggers
OOW 2010: Blogger Meetup - The Winner!
After waiting for Vanessa to get back from either OOW Detox, vacation, or just life, the winners of the Apple TV have finally been announced. Sunil Ranka, this guy:  Won one (yes! more than 1) of the Apple TVs with his post Mapping the Maze, Online Bloggers to Real World Faces : Pythian Blogger Meetup at OOW10. Guess who won the other one? Go ahead, take a moment. Part I - Part II - Part III - Part IV - Part VYou know when the teacher says, "I need a one page paper on George Washington" and one of your classmates turns in 10 pages, like, the week before it's due? Apparently I'm that guy. I may have scared off a few people from writing about the event. That wasn't my intention, but apparently I did want it. So, my first Apple product (wifey does have an iPhone). It should be interesting, I'm sure I'll report back here once I figure it all out. Thanks to Pythian, HP and OTN for supporting the event. Thanks to Pythian for giving away the Apple TV. Labels: 2010, blogging, oow
OBIEE 11g: Connect to Online Repository
I have been doing a quick and dirty proof of concept on 11g. The 32 bit installation went very smoothly on Monday, and then the hard work began. 11g was quite different from 10g and possibly the biggest differentiator was its integration with the WebLogic stack. While I do understand that move, it certainly makes things a more complex in the short run. So I'm up and running and have the first RPD installed (that's another post, deploying an RPD...joy!), then the change requests begin to roll in. When I would try to open the RPD in online mode, I was greeted with this challenge:  OK, I know the repository password, but I don't remember setting an Administrator password (that was the default username). I tried everything I could think of, Admin123, which is the repository password for the sample application. Tried password. Tried every variation of it. No joy. In the interest of time (and pressure), I gave up and just decided to edit the offline and then deploy. I was the only one on this system so I wouldn't be affecting anyone. In hindsight, it would have been best to ask my question (or read the docs). A day later 2 more people joined me to help nail down some reports. I couldn't bring the server down everytime I needed to make a small change, so I asked the Twitter Machine...as usual, it comes through. Here's the response: @siebel_ess's link took me to the documentation. @bsousapt's link took me to the 10g way of doing it, which is actually a good compare and contrast as I'm too lazy to show the differences. Perhaps on purpose, the first link led me to this page:  I'm sure the emphasis, for me, should have been placed on the "Understanding" part of the title. So first off, I needed to log in to the console at localhost:7001/console. From there I would look for Security Realms:  Since I didn't do any customization of the Security stuff (naturally), I went to the default "myrealm":  Then found Users and Groups  And selected New  The screen is pretty basic, just username, description (optional), Provider (DefaultAuthenticator for me) and the password:  Annoyingly to me, you couldn't add any other attributes, like Group Membership on this initial screen. So I saved, then clicked on the user and was taken to their settings page...where I now find Groups.  This is my account, so I chose the 3 Groups related to OBIEE: BIAdministrators, BI Authors, and BIConsumers  Easy enough. Now let's try it out. Opened up the BI Admin tool and opened my online repository. Entered the repository password, my username and the password. Voila! I'm in. Just an FYI, I am a glutton for punishment. I deployed 20 some-odd times before I finally looked this up. While not the most efficient, it did sear the process into my brain. Labels: 11g, howto, obiee, oradb, rpd
OBIEE 11G: Connection Gotchas
Doing a quick PoC, I've had to spin up 11g on very short notice. While anarchy is fun, I typically prefer a more guided approach. Despite not reading documentation ahead of time (much), there is a method to my madness. I learn best by breaking stuff...multiple times. So, there I am, fresh from exporting from Discoverer then migrating that RPD from 10g to 11g...configuring the Connection Pools. I select a random table and then hit View Data.  Awesome. Very descriptive. I tried using the BI ODBC Client tool to test the connection.  Awesomer. Using the Google Machine, I found this reference to Visual Basic (is that really still used?). Let's try looking something else up (like the documentation you say?). Actually, I didn't find it, a colleague did. Over on the Siebel Essentials blog, tip #4 for OBIEE 11g, Connections. To sum it up, you can either use the tns entry as the Data Source Name or you must put a tnsnames.ora file in the <ORACLE_HOME>\OracleBI1\network\admin folder. Awesomest. Labels: 11g, gotcha, obiee, oradb
OBIEE: obieerpdmigrateutil.exe
I needed to quickly spin up an OBIEE 11g instance (Windows Server 2003, 32 bit) for a PoC. The install went smoothly (unlike my other attempts on a 64 bit Windows environment). With the database and the application server, the machine is running at about 2.5 GB of RAM, 4 is recommended to simply install (including 11 GB of free space). Anyway, after migrating my Discoverer EUL over to OBIEE, and figuring out the new file structure, I opened up the RPD and received the following goodness:  Yes, I should really read the documentation. I have been, apparently just haven't gotten to that part yet. (Admittedly, I've been reading from the 50,000 foot level). In the bin directory (which isn't where it used to be) is a utility called obieerpdmigrateutil.exe To run it issue the following from the command line: <ORACLE_HOME>\instances\instance1\config\OracleBIServerComponent\coreapplication_obis1>obieerpdmigrateutil.exe -i <ORACLE_HOME>\instances\instance1\bifoundation\OracleBIServerComponent\coreapplication_obis1\repository\obiee_10g.rpd -u Administrator -L obiee_10g_diff -O <ORACLE_HOME>\instances\instance1\bifoundation\OracleBIServerComponent\coreapplication_obis1\repository\obiee_11g.rpd You'll be prompted for the Administrator password (which I left blank) and then an encryption password which becomes your new Administrator password. Please enter the 10g Admin password:
Please enter the encryption password New_Admin_Passw0rd Parameters for the utility are as follows (and you must use them all) obieerpdmigrateutil -I repository_path -O new_rpd_path -L LDIF_file_path [-U 10g_admin_username] [-8] -O Generate output repository. -I The path of a repository. -L Generate LDIF file for users and groups in the repository. -U Name of a user with Administrator privilege in the 10g RPD -8 Use UTF-8 encoding for LDIF file. -h Display this usage information and exit. More on this tool and when it should be used (MUD) here. Labels: 11g, obiee, oradb, utilities
Never Use RAISE_APPLICATION_ERROR Again
By Michael O’Neill http://twitter.com/cleverideanet (professional) http://twitter.com/oraclenude (personal) oraclenerd articlesIf you write Oracle PL/SQL, you know what RAISE_APPLICATION_ERROR is. It is an abomination of hard-coding and poor practice. If you didn't know that, I'm sorry I was the one who told you. I've written and used extensively an ultra-simple framework to eliminate RAISE_APPLICATION_ERROR from my code forever. Here's an example (assume 11gR2) of something we all know we can do: begin dbms_output.put_line(1/0); end; This will throw an unhandled ORA-01476 exception. We could write some meaningful handling of that with this: begin dbms_output.put_line(1/0); exception when zero_divide then dbms_output.put_line('zero divide exception caught'); end; This coding is elegant because Oracle has conveniently predefined an exception named ZERO_DIVIDE and a corresponding pragma for us. Unfortunately, Oracle has only 22 predefined exceptions. What happens when I do this: declare d date; begin d := to_date('2010-09-30', 'YYYY-MM-DD'); -- works dbms_output.put_line(d); d := to_date('12345-09-30', 'YYYY-MM-DD'); -- fails dbms_output.put_line(d); end; This will throw an unhandled ORA-01861 exception. My option to handle this is less than meaningful because this is not a predefined exception: declare d date; begin d := to_date('2010-09-30', 'YYYY-MM-DD'); -- works dbms_output.put_line(d); d := to_date('12345-09-30', 'YYYY-MM-DD'); -- fails dbms_output.put_line(d); exception when others then case sqlcode when -1861 then dbms_output.put_line('literal does not match exception caught'); else raise; end case; end; This leads me to the inevitable desire to create my own named exception and pragma, so I could have code that looks like this instead: declare d date; begin d := to_date('2010-09-30', 'YYYY-MM-DD'); -- works dbms_output.put_line(d); d := to_date('12345-09-30', 'YYYY-MM-DD'); -- fails dbms_output.put_line(d); exception when error.ora_literal_string_mismatch then dbms_output.put_line('literal does not match exception caught'); end; Understanding this, creating my own ERROR package with a friendly named exception and pragma for ORA-01861 leads me to the pattern of how to handle my own application exceptions, namely defining an exception and pragma. But how does this get RAISE_APPLICATION_ERROR out of my life? Consider the ERROR abbreviated package source I use (full source: error.pks and error.pkb): create or replace package error is package_name constant varchar2(32) := 'error'; -- in case you want to change the package name -- application exceptions and pragmas (snip) not_one_based constant string(64) := package_name || '.app_not_one_based'; app_not_one_based exception; pragma exception_init(app_not_one_based, -20004); sparsity_not_allowed constant string(64) := package_name || '.app_sparsity_not_allowed'; app_sparsity_not_allowed exception; pragma exception_init(app_sparsity_not_allowed, -20003); parameter_cannot_be_null constant string(64) := package_name || '.app_parameter_cannot_be_null'; app_parameter_cannot_be_null exception; pragma exception_init(app_parameter_cannot_be_null, -20002); string_too_large constant string(64) := package_name || '.app_string_too_large'; app_string_too_large exception; pragma exception_init(app_string_too_large, -20001); application_exception constant string(64) := package_name || '.app_application_exception'; app_application_exception exception; pragma exception_init(app_application_exception, -20000); -- rdbms exceptions and pragmas (snip) literal_string_mismatch constant string(64) := package_name || '.ora_literal_string_mismatch'; ora_literal_string_mismatch exception; pragma exception_init(ora_literal_string_mismatch, -1861); (snip) procedure throw(p_exception in varchar2); procedure throw ( p_exception in varchar2 ,p_message in varchar2 ); end; You can see several user-defined exceptions and pragmas as well as the ORA_LITERAL_STRING_MISMATCH used in the previous example. The full source has more defined, but is not relevant to understanding the concept I am presenting. Notice there is just one (overloaded) method, THROW. THROW is what I use instead of RAISE_APPLICATION_ERROR. So, instead of this: declare s string(3) := 'abc'; begin if (instr(s,'b') > 0) then raise_application_error(-20000, 'I hate the letter b'); end if; end; I use this: declare s string(3) := 'abc'; begin if (instr(s,'b') > 0) then error.throw(error.application_exception, 'I hate the letter b'); end if; end; On its surface this doesn’t seem terribly interesting or useful. Below the surface, several powerful advantages are gained: - A single ERROR package encapsulates a schema’s application exceptions and pragmas, giving me a consistent SQLCODEs returned to my C# code.
- No more, remembering what number to use in RAISE_APPLICATION_ERROR.
- Easier to understand code
- I can effectively organize my exceptions without sprawling them throughout a schema’s packages
- I can extend the ERROR package (and I have) to do many more things like logging or default messages for exceptions without writing that into my schema’s application packages.
How does it work? Taking a look at the body for the THROW method reveals all: procedure throw ( p_exception in varchar2 ,p_message in varchar2 ) is begin begin begin execute immediate ('begin raise ' || p_exception || '; end;'); -- exception is raised and immediately trapped exception when ora_plsql_compilation_error then throw(error.exception_does_not_exist, p_exception); end; exception when others then if sqlcode between - 20999 and - 20000 then raise_application_error(sqlcode, p_message); -- this is the best/only use of raise_application_error -- and eliminates the need in application code else raise; -- nothing extra to do for extra for exceptions outside raise_application_error range end if; end; exception when others then raise; -- finally, bubbles up the original throw() call end throw; There are few caveats I have using this development pattern. I don’t consolidate every exception I write into my ERROR package, only those exceptions that I want to bubble up unhandled to my C# code. I don’t feel it is necessary to have the same ERROR package in every application schema. In other words I don’t evolve every incarnation of my ERROR package when I’m adding exceptions and pragmas to one schema’s ERROR package. Finally, my ERROR package has a multitude more bells and whistles I’m not sharing in this post for clarity’s sake. If you are interested in a more extended version of my ERROR, let me know via Twitter (@cleverideanet) Copyright © 2010 Michael O'Neill Published by Permission on oraclenerdLabels: development, error, howto, moneill, oradb
OOW 2010: The Appreciation Event
By: Anonymous UnicornThis post started as an email from a friend of mine (yes, I have one or two), who is also my unicorn (someone who has worked with me and would consider it again, there are so few). I thought it was funny and asked him immediately if I could post it, he agreed, but wanted to expand a little bit.
I did not attend the appreciation event, I gave my ticket away. At the Blogger Meetup, I looked at the lines to get on the buses and I didn't want any part of it. I gave my ticket away.At the OpenWorld appreciation event they split out their 6 bands on two stages going simultaneously all night. They went all out...there was a carnival in the back where the rides and games were free. Of course with 41,000 people attending OOW the obvious drawback would be transportation, so being on the most popular bus route meant the better part of an hour standing in line both to and from the event. That was expected, but it was the food situation that stuck in my mind. When we arrived, we swam through masses of people, Berlin playing on the outside stage, and English Beat playing inside a sound stage next door. Not having eaten in 7 hours, the goal was food and drink. After examining the two stages, and seeing no signs of food and drink, I had to get out the map. Everything was in the back, so away we headed following the masses. We got to the food tent...huge tent, nicely decorated inside and out. No food was visible, but we could see clusters of people surrounding what appeared to be circular table configurations, looked like a shark feeding frenzy. Must be food! We tried to lean into one of the feeding stations, and while we realized it was in fact food, being 5 people deep, I couldn’t identify what was there. Fortunately a server came by and said there were 23 food stations in two tents and the second tent was less busy. We quickly retreated and shuffled amongst the heavy crowd, out of one tent and into the next. This one had 4 long buffets and a handful of feeding stations. While we could actually see what was being served here, the problem was everyone in this tent queued up and lines were LONG. I stood in one line for a bit and realized that no one else knew what was going on either, they just got in line because that seemed to be the thing to do. These are all highly paid professionals acting like carnal beasts in one tent or lemmings in the other, men, women, old, young, no difference. To me both options were ridiculous so I went over to see what was actually on the table... it wasn't even food...just hors d’oevres like cheeses and grapes! Starving, I cut in real quick (which didn’t affect the stagnant line) grabbed a small paper plate and put a spoonful of couscous on a plate with a few grapes and stood off to the side devouring it within 6 steps as I scanned for the real food. There it was! Small ribs, fancy spaghetti, can’t even remember what else was there because I never got the opportunity to eat it, but I decided to try by finding the end of the line... I kept walking until I realized I’d rather starve than stand in a line that long. I calculated each 4 table station is supposed to serve as many as 2000 people, and understood what the real situation was: survival. I took my small, but at this point, very valuable plate, and cut in for a few small ribs and decided to go watch Berlin until the lines died down. For now the immediate hunger had simmered down. I watched Berlin for a few songs, shuffled in to see a few Don Henley songs in the sound stage, then reversed right back out to get in position for the Black Eyed Peas (because they decided to put their two best acts on at the same time). I suppose I made the mistake of trying to get close but standing on the floor and being less than 6’4” tall, all I could do was watch the otherwise very nice screens. A girl all of 5 foot tall stood between me and the stage holding up a stuffed dog as high as she could and made it dance with every song... it was all she could do because I’m not certain she could even see the video screens... great show, and worth the effort to come. When it ended at 11:30pm I made a beeline back to the food tents. I was alone at this point because it was 2:30am eastern time. Mistake. Both tents looked like apocalyptic wastelands with tired people trudging along table to table, tent to tent to find food. People were tired and in much fewer numbers. Some were collapsed at the few tables around the edges, and scavengers were picking scraps off the feeding stations, still in lines, and many lines had more people than food. The whole thing was surreal. There was actually some couscous left, but since last time they had introduced a few plates of brownies and cookies here and there. When you’re hungry, cookies just don’t cut it, so I dove in for some more couscous and a couple brownies, and after scanning both tents realized it was a cookie or nothing. One table left, a couple plates of cookies, no line.. it was like heaven! So I’m pretty thirsty by now... and no, there were no drinks in the food tents that I ever identified. Fortunately the beverage booths around the carnival were still well stocked and hardly any lines at this point. I got a half-can of sierra mist (I guess it exists because it fits nicely in a cup with ice) and tried to figure out what to do next. Lots of people left, but apparently the carnival games are free, and unlike the food lines, these lines were moving ok. I can’t leave without trying can I? I decided to try 1 game, chose the game with the biggest prize and stood in the 4-line basketball game for 20 minutes watching hundreds of shots, most of which didn’t hit the rim or even the backboard. One girl won in my line, which I thought was awesome, because it’s actually possible to win. The guy in front of me talked a lot of trash and spent a lot of time plotting his strategy only to brick it like the others. Two shots each, my first shot was a brick too....second went right in! It’s true those rims barely fit the ball, but it is possible! That large stuffed animal forced me to check in a bag on the flight home, but my daughter loved it. I caught several Steve Miller songs on the way out... it was awesome, I forgot how blues oriented he is, but I knew I had very little sleep ahead of me, so I had to cut out early and back to the buses I went. Lucky #13 bus line was 5 times as long as any other bus line and in retrospect I might have been better off being dropped off somewhere in the middle of San Francisco 3 miles from my hotel at 1am than to stand in that line... but like a good lemming, I stayed, knowing that not many hours later is my next session, and the next night would be spent on a plane rather than in a bed, heading back to the East Coast. But it was worth it. Labels: 2010, funny, oow
Discoverer to OBIEE Migration Utility
I couldn't find a whole lot of information on this utility, so of course I'm putting it up here for my own reference. File name is called migrateEUL.exe and is located in the OracleBI\server\bin directory. It's not very difficult to run, just type in: c:\migrateeul file.eex Easy. To generate the eex file from Discoverer, open up the Discoverer Administrator tool and then connect to the eul you want to export. Cancel out of the Load Wizard  Then go to File, Export and select the business areas you want to export. You'll be prompted to name that file and then hit finish. Running the utility will produce something like the following: C:\Documents and Settings\chet\Desktop>migrateeul pdi_eul.eex
Oracle BI SE - EE Migration Assistant Version 10.1.3.4.0
Reading Configuration File...
Error reading configuration !!! Reverting to defaults...[DONE]
Parsing EUL export file C:\Documents and Settings\chet\Desktop\eul.eex...[DONE]
Repository creation started...
Processing Business Area : Business Area 1....[DONE]
Processing Business Area : Business Area 2....[DONE]
Processing Business Area : Business Area 3....[DONE]
Processing Business Area : Business Area 4....[DONE]
Processing Business Area : Business Area 5....[DONE]
Processing Business Area : Business Area 6....[DONE]
All Business Area(s) processed
The migrated repository is saved at C:\Documents and Settings\chet\Desktop\eul.rpd
Migration log is saved at C:\Documents and Settings\chet\Desktop\eul.migration.log
------------------------------------------ EUL MIGRATION SUCCESSFUL ------------------------------------------ Now on to the fun part, using that newly created RPD and making everything pretty. Labels: discoverer, obiee, oradb, utilities
Fun with Service Accounts
Using a service account to access a production database, my login script returns the following: SQL*Plus: Release 11.2.0.1.0 Production on Sat Oct 2 08:02:11 2010
Copyright (c) 1982, 2010, Oracle. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options
***roles granted***
ROLE ------------------------------- CONNECT RESOURCE DBA SELECT_CATALOG_ROLE EXECUTE_CATALOG_ROLE DELETE_CATALOG_ROLE EXP_FULL_DATABASE IMP_FULL_DATABASE OLAP_DBA XDBADMIN DATAPUMP_EXP_FULL_DATABASE DATAPUMP_IMP_FULL_DATABASE XDB_SET_INVOKER OLAP_XS_ADMIN JAVA_ADMIN HS_ADMIN_ROLE JAVA_DEPLOY GATHER_SYSTEM_STATISTICS SCHEDULER_ADMIN CERIDIAN_ROLE
20 rows selected.
***system privileges granted***
PRIVILEGE ------------------------------- ADMINISTER ANY SQL TUNING SET ADMINISTER DATABASE TRIGGER ADMINISTER RESOURCE MANAGER ADMINISTER SQL MANAGEMENT OBJECT ADMINISTER SQL TUNING SET ADVISOR ALTER ANY ASSEMBLY ALTER ANY CLUSTER ALTER ANY CUBE ALTER ANY CUBE DIMENSION ALTER ANY DIMENSION ALTER ANY EDITION ALTER ANY EVALUATION CONTEXT ALTER ANY INDEX ALTER ANY INDEXTYPE ALTER ANY LIBRARY ALTER ANY MATERIALIZED VIEW ALTER ANY MINING MODEL ALTER ANY OPERATOR ALTER ANY OUTLINE ALTER ANY PROCEDURE ALTER ANY ROLE ALTER ANY RULE ALTER ANY RULE SET ALTER ANY SEQUENCE ALTER ANY SQL PROFILE ALTER ANY TABLE ALTER ANY TRIGGER ALTER ANY TYPE ALTER DATABASE ALTER PROFILE ALTER RESOURCE COST ALTER ROLLBACK SEGMENT ALTER SESSION ALTER SYSTEM ALTER TABLESPACE ALTER USER ANALYZE ANY ANALYZE ANY DICTIONARY AUDIT ANY AUDIT SYSTEM BACKUP ANY TABLE BECOME USER CHANGE NOTIFICATION COMMENT ANY MINING MODEL COMMENT ANY TABLE CREATE ANY ASSEMBLY CREATE ANY CLUSTER CREATE ANY CONTEXT CREATE ANY CUBE CREATE ANY CUBE BUILD PROCESS CREATE ANY CUBE DIMENSION CREATE ANY DIMENSION CREATE ANY DIRECTORY CREATE ANY EDITION CREATE ANY EVALUATION CONTEXT CREATE ANY INDEX CREATE ANY INDEXTYPE CREATE ANY JOB CREATE ANY LIBRARY CREATE ANY MATERIALIZED VIEW CREATE ANY MEASURE FOLDER CREATE ANY MINING MODEL CREATE ANY OPERATOR CREATE ANY OUTLINE CREATE ANY PROCEDURE CREATE ANY RULE CREATE ANY RULE SET CREATE ANY SEQUENCE CREATE ANY SQL PROFILE CREATE ANY SYNONYM CREATE ANY TABLE CREATE ANY TRIGGER CREATE ANY TYPE CREATE ANY VIEW CREATE ASSEMBLY CREATE CLUSTER
PRIVILEGE ------------------------------- CREATE CUBE CREATE CUBE BUILD PROCESS CREATE CUBE DIMENSION CREATE DATABASE LINK CREATE DIMENSION CREATE EVALUATION CONTEXT CREATE EXTERNAL JOB CREATE INDEXTYPE CREATE JOB CREATE LIBRARY CREATE MATERIALIZED VIEW CREATE MEASURE FOLDER CREATE MINING MODEL CREATE OPERATOR CREATE PROCEDURE CREATE PROFILE CREATE PUBLIC DATABASE LINK CREATE PUBLIC SYNONYM CREATE ROLE CREATE ROLLBACK SEGMENT CREATE RULE CREATE RULE SET CREATE SEQUENCE CREATE SESSION CREATE SYNONYM CREATE TABLE CREATE TABLESPACE CREATE TRIGGER CREATE TYPE CREATE USER CREATE VIEW DEBUG ANY PROCEDURE DEBUG CONNECT SESSION DELETE ANY CUBE DIMENSION DELETE ANY MEASURE FOLDER DELETE ANY TABLE DEQUEUE ANY QUEUE DROP ANY ASSEMBLY DROP ANY CLUSTER DROP ANY CONTEXT DROP ANY CUBE DROP ANY CUBE BUILD PROCESS DROP ANY CUBE DIMENSION DROP ANY DIMENSION DROP ANY DIRECTORY DROP ANY EDITION DROP ANY EVALUATION CONTEXT DROP ANY INDEX DROP ANY INDEXTYPE DROP ANY LIBRARY DROP ANY MATERIALIZED VIEW DROP ANY MEASURE FOLDER DROP ANY MINING MODEL DROP ANY OPERATOR DROP ANY OUTLINE DROP ANY PROCEDURE DROP ANY ROLE DROP ANY RULE DROP ANY RULE SET DROP ANY SEQUENCE DROP ANY SQL PROFILE DROP ANY SYNONYM DROP ANY TABLE DROP ANY TRIGGER DROP ANY TYPE DROP ANY VIEW DROP PROFILE DROP PUBLIC DATABASE LINK DROP PUBLIC SYNONYM DROP ROLLBACK SEGMENT DROP TABLESPACE DROP USER ENQUEUE ANY QUEUE EXECUTE ANY ASSEMBLY EXECUTE ANY CLASS EXECUTE ANY EVALUATION CONTEXT EXECUTE ANY INDEXTYPE
PRIVILEGE ------------------------------- EXECUTE ANY LIBRARY EXECUTE ANY OPERATOR EXECUTE ANY PROCEDURE EXECUTE ANY PROGRAM EXECUTE ANY RULE EXECUTE ANY RULE SET EXECUTE ANY TYPE EXECUTE ASSEMBLY EXPORT FULL DATABASE FLASHBACK ANY TABLE FLASHBACK ARCHIVE ADMINISTER FORCE ANY TRANSACTION FORCE TRANSACTION GLOBAL QUERY REWRITE GRANT ANY OBJECT PRIVILEGE GRANT ANY PRIVILEGE GRANT ANY ROLE IMPORT FULL DATABASE INSERT ANY CUBE DIMENSION INSERT ANY MEASURE FOLDER INSERT ANY TABLE LOCK ANY TABLE MANAGE ANY FILE GROUP MANAGE ANY QUEUE MANAGE FILE GROUP MANAGE SCHEDULER MANAGE TABLESPACE MERGE ANY VIEW ON COMMIT REFRESH QUERY REWRITE READ ANY FILE GROUP RESTRICTED SESSION RESUMABLE SELECT ANY CUBE SELECT ANY CUBE DIMENSION SELECT ANY DICTIONARY SELECT ANY MINING MODEL SELECT ANY SEQUENCE SELECT ANY TABLE SELECT ANY TRANSACTION UNDER ANY TABLE UNDER ANY TYPE UNDER ANY VIEW UNLIMITED TABLESPACE UPDATE ANY CUBE UPDATE ANY CUBE BUILD PROCESS UPDATE ANY CUBE DIMENSION UPDATE ANY TABLE
202 rows selected. Awesome! Labels: dba, funny
|