Creating a Readonly Database User



Here’s a common task: You need to create a database user with read only access.  You have some power users who know how to use SQL, and they are allowed to see all of the data in the system.  You can use these commands to create such a user (in Oracle):

create user PSRO identified by PSRO;
grant create session, select any table, select any dictionary to PSRO;

Note: You can probably find this all over the web, but I wanted to capture it on my blog so that I could find the syntax easier.

Resources


Share
Posted in Oracle DBA, SQL. 1 Comment »

Finding Data in Temp Tables

Here’s a simple little trick for Application Engines that have Temporary Tables assigned.

When you have temporary tables, you don’t know for sure which Temporary Table it is using.  You could write a quick select and change the number on the end until you find the one you are looking for, but here is a slightly quicker method.

Note: This is designed for Oracle, but you could easily change it up to work with SQL Server.

First, build a select statement that will list all of the tables.  We’ll assume our Temporary Table Record is MY_TEMP_TAO.  You can substitute with your specific record.

SELECT 'UNION SELECT ''' || TABLE_NAME || ''' TBL, A.* FROM SYSADM.' || TABLE_NAME || ' A'
FROM DBA_TABLES
WHERE table_name LIKE 'PS_MY_TEMP_TAO%';

The output should look something like this:

UNION SELECT 'PS_MY_TEMP_TAO' TBL, A.* FROM SYSADM.PS_MY_TEMP_TAO A
UNION SELECT 'PS_MY_TEMP_TAO1' TBL, A.* FROM SYSADM.PS_MY_TEMP_TAO1 A
UNION SELECT 'PS_MY_TEMP_TAO2' TBL, A.* FROM SYSADM.PS_MY_TEMP_TAO2 A
UNION SELECT 'PS_MY_TEMP_TAO3' TBL, A.* FROM SYSADM.PS_MY_TEMP_TAO3 A
UNION SELECT 'PS_MY_TEMP_TAO4' TBL, A.* FROM SYSADM.PS_MY_TEMP_TAO4 A
UNION SELECT 'PS_MY_TEMP_TAO5' TBL, A.* FROM SYSADM.PS_MY_TEMP_TAO5 A
UNION SELECT 'PS_MY_TEMP_TAO6' TBL, A.* FROM SYSADM.PS_MY_TEMP_TAO6 A;

You just simply need to delete the first Union to make something like this:

SELECT 'PS_MY_TEMP_TAO' TBL, A.* FROM SYSADM.PS_MY_TEMP_TAO A
UNION SELECT 'PS_MY_TEMP_TAO1' TBL, A.* FROM SYSADM.PS_MY_TEMP_TAO1 A
UNION SELECT 'PS_MY_TEMP_TAO2' TBL, A.* FROM SYSADM.PS_MY_TEMP_TAO2 A
UNION SELECT 'PS_MY_TEMP_TAO3' TBL, A.* FROM SYSADM.PS_MY_TEMP_TAO3 A
UNION SELECT 'PS_MY_TEMP_TAO4' TBL, A.* FROM SYSADM.PS_MY_TEMP_TAO4 A
UNION SELECT 'PS_MY_TEMP_TAO5' TBL, A.* FROM SYSADM.PS_MY_TEMP_TAO5 A
UNION SELECT 'PS_MY_TEMP_TAO6' TBL, A.* FROM SYSADM.PS_MY_TEMP_TAO6 A;

If you know your temp table has the process instance as the key and you know the one you are looking for, you could do something like this:

SELECT * FROM (
     SELECT 'PS_MY_TEMP_TAO' TBL, A.* FROM SYSADM.PS_MY_TEMP_TAO A
     UNION SELECT 'PS_MY_TEMP_TAO1' TBL, A.* FROM SYSADM.PS_MY_TEMP_TAO1 A
     UNION SELECT 'PS_MY_TEMP_TAO2' TBL, A.* FROM SYSADM.PS_MY_TEMP_TAO2 A
     UNION SELECT 'PS_MY_TEMP_TAO3' TBL, A.* FROM SYSADM.PS_MY_TEMP_TAO3 A
     UNION SELECT 'PS_MY_TEMP_TAO4' TBL, A.* FROM SYSADM.PS_MY_TEMP_TAO4 A
     UNION SELECT 'PS_MY_TEMP_TAO5' TBL, A.* FROM SYSADM.PS_MY_TEMP_TAO5 A
     UNION SELECT 'PS_MY_TEMP_TAO6' TBL, A.* FROM SYSADM.PS_MY_TEMP_TAO6 A;
) Z WHERE PROCESS_INSTANCE = 12345

Share
Posted in %Table, App Engine. 1 Comment »

Website Move Complete

Just a quick post to let you know the website move is complete.  I’m sorry about any down time you may have experienced.  Hopefully, I can get active again and start blogging again.

If you are interested in the details check out:


Share
Posted in Blog. No Comments »

Blog Moving Again

Ok, It is time to move the blog again!  But, this time you shouldn’t have to change your bookmarks!  I am just moving the website to new web host.

The transfer is supposed to be seamless, but I suspect you might see a little downtime over the next week as the domain re-registers and points to the new site.  If it’s not working, please give me some time and check back.

I’ll update you on the other side!

Share
Posted in Blog. No Comments »

Running Jasper Reports from Java

As a follow-up to my previous post about using iReport, I wanted to write some code that would run the report.  My goal is something that I can launch from PeopleTools.

Below is some Java that will execute the report and build a PDF output.  This class takes the XML data file and the report designed by iReport and produces a PDF out of it.

package net.digitaleagle.psst0101;

import java.io.File;
import java.util.HashMap;
import java.util.Locale;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.query.JRXPathQueryExecuterFactory;
import net.sf.jasperreports.engine.util.FileResolver;
import net.sf.jasperreports.engine.util.JRXmlUtils;

import org.w3c.dom.Document;

public class JasperInterface {
	private String dataPath;
	private String basePath;
	private String reportName;
	private String reportOutput;

	public JasperInterface(String dataPath, String basePath, String reportName, String reportOutput) {
		this.dataPath = dataPath;
		this.basePath = basePath;
		this.reportName = reportName;
		this.reportOutput = reportOutput;
	}

	public void run() throws JRException {
		Document data = JRXmlUtils.parse(dataPath);

		HashMap parms = new HashMap();
		parms.put(JRXPathQueryExecuterFactory.PARAMETER_XML_DATA_DOCUMENT, data);
		parms.put(JRXPathQueryExecuterFactory.XML_DATE_PATTERN, "yyyy-MM-dd");
		parms.put(JRXPathQueryExecuterFactory.XML_LOCALE, Locale.ENGLISH);
		parms.put(JRParameter.REPORT_LOCALE, Locale.US);

		FileResolver fileResolver = new FileResolver() {
			 @Override
			 public File resolveFile(String fileName) {
			  return new File(basePath, fileName);
			 }
			};
		parms.put(JRParameter.REPORT_FILE_RESOLVER, fileResolver);

		JasperReport jr = JasperCompileManager.compileReport(basePath + reportName);
		JasperPrint pr = JasperFillManager.fillReport(jr, parms);
		JasperExportManager.exportReportToPdfFile(pr, reportOutput);
	}
}

Here’s some code that can launch the report without needing the JasperReports classes in the classpath.  I originally thought about just putting the jar files into the class directory in the PeopleSoft Home, but Jasper Reports has a number of Jar files.  So, I created a class that had no dependencies on JasperReports.  I tell it the location of the JasperReports installation, and it builds the necessary class path.

package net.digitaleagle.psst0101;

import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;

public class JasperReportRunner {
	private String jasperPath;
	private String dataPath;
	private String basePath;
	private String reportName;
	private String reportOutput;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String jasperPath = args[0];
		String dataPath = args[1];
		String basePath = args[2];
		String reportName = args[3];
		String reportOutput = args[4];

		JasperReportRunner jrr = new JasperReportRunner(jasperPath, dataPath, basePath, reportName, reportOutput);
		jrr.run();
	}

	public JasperReportRunner(String jasperPath, String dataPath, String basePath, String reportName, String reportOutput) {
		this.jasperPath = jasperPath;
		this.dataPath = dataPath;
		this.basePath = basePath;
		this.reportName = reportName;
		this.reportOutput = reportOutput;
	}

	public void run() {
		ArrayList urls = new ArrayList();
		File jasperDir = new File(jasperPath);
		addJars(urls, new File(jasperDir, "dist"));
		addJars(urls, new File(jasperDir, "lib"));
		URLClassLoader ucl = new URLClassLoader(urls.toArray(new URL[0]));
		Class jic;
		try {
			jic = ucl.loadClass(this.getClass().getPackage().getName() + ".JasperInterface");
		} catch (ClassNotFoundException e) {
			System.err.println("Could not access JasperInterface class");
			e.printStackTrace();
			return;
		}
		Constructor c = jic.getConstructors()[0];
		Object ji;
		try {
			ji = c.newInstance(dataPath, basePath, reportName, reportOutput);
		} catch (Exception e) {
			System.err.println("Error creating new instance of JasperInterface");
			e.printStackTrace();
			return;
		}
		Method method;
		try {
			method = jic.getMethod("run");
		} catch (Exception e) {
			System.err.println("Could not get run method");
			e.printStackTrace();
			return;
		}
		try {
			method.invoke(ji);
		} catch (Exception e) {
			System.err.println("Could not get execute run method");
			e.printStackTrace();
			return;
		}
	}

	private void addJars(ArrayList urls, File jarDir) {
		if(!jarDir.exists()) {
			System.err.println("Could not find Jasper Jar files in directory: " + jarDir.getAbsolutePath());
			System.err.println("Check installation directory");
			return;
		}
		for(File jarFile : jarDir.listFiles()) {
			if(jarFile.isFile() && jarFile.getName().toLowerCase().endsWith(".jar")) {
				try {
					urls.add(jarFile.toURI().toURL());
				} catch (MalformedURLException e) {
					System.err.println("Error loading jar for class path: " + jarFile.getAbsolutePath());
					e.printStackTrace();
				}
			}
		}
	}

}

Resources

Share

Using iReport with Query Output

Because Oracle has stopped delivering Crystal Reports with PeopleSoft, I heard a few discussions about whether or not to license it for a new installation.  So, it’s an perfect timing to explorer an alternative tool.

Let me introduce JasperReports.  It is open-source, Java-based report generation tool.  The reports are XML files, but they have a tool called iReport that, in my opinion, is very similar to Crystal Reports.

Here’s the descriptions from their website:

iReport:

iReport is the free, open source report designer for JasperReports. Create very sophisticated layouts containing charts, images, subreports, crosstabs and much more. Access your data through JDBC, TableModels, JavaBeans, XML, Hibernate, CSV, and custom sources. Then publish your reports as PDF, RTF, XML, XLS, CSV, HTML, XHTML, text, DOCX, or OpenOffice.

Jasper Reports:

JasperReports is the world’s most popular open source reporting engine. It is entirely written in Java and it is able to use data coming from any kind of data source and produce pixel-perfect documents that can be viewed, printed or exported in a variety of document formats including HTML, PDF, Excel, OpenOffice and Word.

So, as an introduction, let me give you a walk through introduction of using iReport to design a report based on a Query.

(more…)

Share

Explorations in SQL: Fixing Duplicates for Index

I had an issue with some indexes that would not create. The database complained that the table had duplicates in it that violated the index.  For me, the table was PS_AUC_HDR, but these steps should work for any table.  Maybe some of the techniques will be helpful too.  Also, if you know a better way to take care of the problem, please comment.

(more…)

Share

Great Links: Oracle Database Administration Commands

This article is just to remember some links that I found while working on some database issues.  Maybe they will help someone else:

Viewing the Large Pool Size (from here):

SELECT name, SUM(bytes) FROM V$SGASTAT WHERE pool='large pool'
GROUP BY ROLLUP(name);

Here are the command to view the different memory related settings/parameters (from here):

show parameter sga_target

show sga

show parameter pool

Flushing cache, etc. (from here)

alter system flush buffer_cache;

alter system flush shared_pool;

alter system switch log_file;

Resources

Share

Integration Broker error: Cannot establish HTTP connection

I have been fighting with this error message:

IB Error: Cannot  establish HTTP connection

Here’s the text of the message:

Cannot establish HTTP connection (158, 2842)

Can be cause by any of the following:
1. Cannot load certificates due to keystore password (not encrypted)
2. Keystore file not found
3. Proxy server not configured

Finding IB Logging

One thing I found was the error log thanks to the PeopleSoft wiki.  The wiki has a very good article on Integration Broker Logging.

For me, the logs where located at:

  • http://skphcm90/PSIGW/errorLog.html
  • http://skphcm90/PSIGW/msgLog.html

On the Advanced Properties page, I adjusted the ig.log.level from 2 to 5:

IB Setting Log Level

While that was a good tip to learn, that didn’t really help me.  It didn’t produce any extra information.

Finding a Solution

I actually found my solution on Oracle support in article [ID 1270683.1].

The fix is back on the Advanced Gateway Properties.  Go to PeopleTools > Integration Broker > Configuration > Gateways and click on the Gateway Setup Properties.

Gateway Properties

After logging in, click on the Advanced Properties Page link:

Advanced Properties Page

Then, find the secureFileKeystorePasswd option and copy the password down to the Password Encryption box.  Next, click the Encrypt button to get your encrypted version.

Copying password for IB

Finally, copy the encrypted version back up to the setting.

Applying Encrypted Password

Click OK, and exit out of the Gateway setup saving along the way.  Now, your error should be fixed!

Share

Creating a First Test with PTF

I have been wanting to blog more about the PTF, and this seemed like a good place to start.  Here’s just a first simple test just to show the basics of creating a test.

(more…)

Share