views:

899

answers:

17

When should I be using stored procedures instead of just writing the logic directly in my application? I'd like to reap the benefits of stored procedures, but I'd also like to not have my application logic spread out over the database and the application.

Are there any rules of thumb that you can think of in reference to this?

+1  A: 

I tend to avoid stored procedures. The debugging tools tend to be more primitive. Error reporting can be harder (vs your server's log file) and, to me at least, it just seems to add another language for no real gain.

There are cases where it can be useful, particularly when processing large amounts of data on the server and of course for database triggers that you can't do in code.

Other than that though, I tend to do everything in code and treat the database as a big dump of data rather than something I run code on.

Consider Who Needs Stored Procedures, Anyways?:

For modern databases and real world usage scenarios, I believe a Stored Procedure architecture has serious downsides and little practical benefit. Stored Procedures should be considered database assembly language: for use in only the most performance critical situations.

and Why I do not use Stored Procedures:

The absolute worst thing you can do, and it's horrifyingly common in the Microsoft development world, is to split related functionality between sproc's and middle tier code. Grrrrrrrr. You just make the code brittle and you increase the intellectual overhead of understanding a system.

cletus
Bad examples do not eliminate the advantages when a method is used properly.
txwikinger
One man's "bad examples" are another man"s "good examples of why something is bad".
cletus
@cletus that doesn't make sense. An example is always limited and never proves a generalization.
txwikinger
You can't disprove it either. You might come up with examples where the "generalization" doesn't apply but hey it's a generalization, not an absolute rule without exception. You should also note that the text includes, for example, "there are cases it can be useful". Either way, the above is my opinion (and that of at least the two others I quoted) and I stand by it.
cletus
"database assembly language"?? That's ridiculous. It's the _same_language_ -- transact-sql. I'm not advocating splitting business logic between the middle tier and the data layer- but your middle tier should be using SPs exclusively to deal with the data. It's a performance thing, unless you're using some crappy rdbms that doesn't precompile store procedures. I'd like to hear one single "Serious Downside".
Jeremy
Could not disagree more.. "no real gain" ? avoiding a round trip is not a gain? (and in most cases where SPs are appropriate, they save MULTIPLE round trips). Oraganizing, and by doing so improving the maintainability, of Database Access code is not a Gain?
Charles Bretana
Just like once the performance gain of assembly language was important, now it's irrelevant for most uses. Once the performance benefit of unmanaged code (eg C/C++) was an important factor. Now it's (mostly) not. There are of course other reasons to use the above. Any supposed performance gains of SPs are likewise (mostly) irrelevant (except in corner cases) today. Maintainability, ease of development (eg unit testing), etc are **far more important**.
cletus
@Cletus: +1 for your arguments against SP. I have always been for SPs, but you make sense.
Kb
Maintainability is IMPROVED by using SPs... it consolidates database access code in one place instead of having it copied/pasted in every application that accesses the data, and written in multiple different watys by different developers... "ease of development" this only "seems" easier for those who are not as competent with SPs as they are with straight SQL. This is typical bias (in both directions) when a skillset imbalance exists.
Charles Bretana
@Cletus: I think you're correct in that the performance issue is often something of a red herring, however I would argue strongly for SPs on the ground of abstraction in any environment where the database is more than just a simple data dump for a single application.
Cruachan
+4  A: 

Basically when you have to perform operations involving data that do not need to get out of the database. For example, you want to update one table with data from another, it makes little sense to get the data out and then back in if you can do it all in one single shot to the db.

Another situation where it may be acceptable to use stored procedures is when you are 100% sure you will never deploy your application to another database vendor. If you are an Oracle shop and you have lots of applications talking to the same database it may make sense to have stored procedures to make sure all of them talk to the db in a consistent manner.

Otávio Décio
+4  A: 

Complicated database queries for me tend to end up as stored procs. Another thought to consider is that your database might be completely separate and distinct from the application. Lets say you run an Oracle DB and you essentially are building an API for other application developers at your organization to call into. You can hide the complicated stuff from them and provide a stored proc in its place.

A very simple example:

registerUser(username, password)

might end up running a few different queries (check if it exists, create entries in a preference table, etc) and you might want to encapsulate them.

Of course, different people will have different perspectives (a DBA versus a Programmer).

Dave Morgan
+1 very good point, I do the same even when coding limited desktop apps as it's good to get the complex database maintenance processing wrapped up and hidden away from the app code.
Cruachan
+2  A: 

It can also be very useful as a matter of encapsulation and in the philosophy of DRY. For instance I use stored functions for calculations inside a table that I need for several queries inside the code. This way I use the better performance as well as the ensuring that the calculation is always done the same way.

I would not use it for higher functionality or logic the should be in the business logic layer of an architecture, but focused on the model layer, where the functionality is clearly focused on the database design and possible flexibility of changing the database design without breaking the API to the other layers.

txwikinger
+25  A: 

Wow... I'm going to swim directly against the current here and say, "almost always". There are a laundry list of reasons - some/many of which I'm sure others would argue. But I've developed apps both with and without the use of stored procs as a data access layer, and it has been my experience that well written stored procedures make it so much easier to write your application. Then there's the well-documented performance and security benefits.

codemonkey
*well* documented performance and security benefits. Just wanted to restate that. We do not put TSQL in applications, EVER. The SQL goes in a stored procedure, the procedure is called from code. No code ever touches even so much as a select statement. Running an SP or not is the difference between pre-compiled and interpreted code- which one do you prefer? The answer to your question is "ALWAYS".
Jeremy
The "well-documented" performance item is actually a non-issue depending on the database engine you are using. However, you should ALWAYS use stored procs simply due to security concerns. When using procs you can deny direct table access and thereby completely secure yourself against most forms of destructive sql injection. Otherwise you are dependent on the code to stop it; which not all programmers are created equal.
Chris Lively
@Chris Lively: Parameterized queries are the most secure against sql injections. See http://palisade.plynt.com/issues/2006Jun/injection-stored-procedures/
Kb
I could be wrong, but as much as I tend to purism on parameterized queries (stored procedures), I'd say it's critical only if user-responses can find their way to the Sql. If an interaction takes user-input (even sanitized user-input) and puts it into Sql, then it better be done through a SP. If user-input isn't involved (e.g. a simple query to get a list of possible values) then I would say it is permissible to do it directly. That being said, I would still never do it. But that's me.
Cyberherbalist
@KB: first, sql injection is just one attack vector against databases. Second, parameterized queries will not save you from someone uploading a malicious document with embedded code. Nor will it save you if a developer forgets to do it. However, simply not allowing direct table access in the first place will prevent all of that.
Chris Lively
@KB: I read the article you linked. Interestingly the attack vector he focused on was in executing dynamic sql; which, again, you shouldn't do.
Chris Lively
+2  A: 

We use stored procedures for all of our reporting needs. They can usually retrieve the data faster and in a way that the report can just spit out directly instead of having to do any kind of calculations or similar.

We also will use stored procedures for complex or complicated queries we need to do that would be difficult to read if they were otherwise inside of our codebase.

TheCodeMonk
+3  A: 

I used stored procs in 1 of 3 scenarios:

Speed When speed is of the utmost importance, stored procedures provide an excellent method

Complexity When I'm updating several tables and the code logic might change down the road, I can update the stored proc and avoid a recompile. Stored procedures are an excellent black box method for updating lots of data in a single stroke.

Transactions When I'm working an insert, delete or update that spans multiple tables. I wrap the whole thing in a transaction. If there is an error, it's very easy to roll back the transaction and throw an error to avoid data corruption.

The bottom 2 are very do-able in code. However, stored procedures provide an black-box method of working when complex and transaction level operations are important. Otherwise, stick with code level database operations.

Security used to be one of the reasons. However, with LINQ and other ORMs out there, code level DAL operations are much more secure than they've been in the past. Stored procs ARE secure but so are ORMs like LINQ.

asp316
A: 

The stored procedures are a method of collecting operations that should be done together on database side, while still keeping them on database side.

This includes:

  • Populating several tables from one rowsource
  • Checking several tables against different business rules
  • Performing operations that cannot be efficiently performed using set-based approach

etc.

The main problem with stored procedures is that they are hard to maintain.

You, therefore, should make stored procedures as easy to maintain as all your other code.

I have an article on this in my blog:

Quassnoi
+10  A: 

This depends entirely on your environment. The answer to the question really isn't a coding problem, or even an analysis issue, but a business decision.

If your database supports just one application, and is reasonably tightly integrated with it, then it's better, for reasons of flexibility, to place your logic inside your application program. Under these circumstances handling the database simply as a plain data repository using common functionality looses you little and gains flexibility - with vendors, implementation, deployment and much else - and many of the purist arguments that the 'databases are for data' crowd make are demonstratively true.

On the other hand if your are handling a corporate database, which can generally be identified by having multiple access paths into it, then it is highly advisable to screw down the security as far as you can. At the very least all appropriate constraints should enabled, and if possible access to the data should be through views and procedures only. Whining programmers should be ignored in these cases as...

  1. With a corporate database the asset is valuable and invalid data or actions can have business-threatening consequences. Your primary concern is safeguarding the business, not how convenient access is for your coders.
  2. Such databases are by definition accessed by more than one application. You need to use the abstraction that stored procedures offer so the database can be changed when application A is upgraded and you don't have the resource to upgrade application B.
  3. Similarly the encapsulation of business logic in SPs rather than in application code allows changes to such logic to be implemented across the business more easily and reliably than if such logic is embedded in application code. For example if a tax calculation changes it's less work, and more robust, if the calculation has to be changed in one SP than multiple applications. The rule of thumb here is that the business rule should be implemented at the closest point to the data where it is unique - so if you have a specialist application then the logic for that app can be implemented in that app, but logic more widely applicable to the business should be implemented in SPs.

Coders who dive into religious wars over the use or not of SPs generally have worked in only one environment or the other so they extrapolate their limited experience into a cast-iron position - which indeed will be perfectly defensible and correct in the context from which they come but misses the big picture. As always, you should make you decision on the needs of the business/customers/users and not on the which type of coding methodology you prefer.

Cruachan
A: 

I've had some very bad experiences with this.

I'm not opposed to stored procedures in their place, but gratuitous use of stored procedures can be very expensive.

First, stored procedures run on the database server. That means that if you have a multi-server environment with 50 webservers and one database server, instead of spreading workloads over 50 cheap machines, you load up one expensive one (since the database server is commonly built as a heavyweight server). And you're risking creating a single-point-of-failure.

Secondly, it's not very easy to write an application solely in stored procedures, although I ran into one that made a superhuman effort to try to. So you end up with something that's expensive to maintain: It's implemented in 2 different programming languages, and the source code is often not all in one place either, since stored procedures are definitively stored in the DBMS and not in a source archive. Assuming that someone ever managed/bothered o pull them out of the database server and source-archive them at all.

So aside from a fairly messy app architecture, you also limit the set of qualified chimpanzees who can maintain it, as multiple skills are required.

On the other hand, stored procedures are extremely useful, IF:

  1. You need to maintain some sort of data integrity across multiple systems. That is, the stored logic doesn't belong to any single app, but you need consistent behavior from all participating apps. A certain amount of this is almost inevitable in modern-day apps in the form of foreign keys and triggers, but occasionally, major editing and validation may be warranted as well.

  2. You need performance that can only be achieved by running logic on the database server itself and not as a client. But, as I said, when you do that, you're eating into the total system resources of the DBMS server. So it behooves you to ensure that if there are significant bits of the offending operation that CAN be offloaded onto clients, you can separate them out and leave the most critical stuff for the DBMS server.

Tim H
If you have "50 webservers" I'd hope you have at least one DBA. Who happens to know TSQL. Which is what stored procedures are written in. There isn't anything messy about it- what is messy is not using store procedures.
Jeremy
Stored procs has nothing to do with how many database servers you will need. The simple reason is that it doesn't matter if it's a proc or embedded SQL, the DB server still has to run the code.
Chris Lively
"since stored procedures are definitively stored in the DBMS and not in a source archive" Bad developers. We always, always keep stored procedures in a source archive. And they don't have to be pulled out of the database and put in source archive, since they flow from the source archive into all databases. (except when they are being developed in dev.)
Shannon Severance
>>We always, always keep stored procedures in a source archive.AB-SO-LUTELY! NOTHING goes into our deployed app that's not in source control. NOTHING.
DaveE
+2  A: 

I tend to always use stored procedures. Personally, I find it makes everything easier to maintain. Then there is the security and performance considerations.

Just make sure you write clean, well laid out and well documented stored procedures.

Amy
+6  A: 

I said this in a comment, but I'm going to say it again here.

Security, Security, SECURITY.

When sql code is embedded in your application, you have to expose the underlying tables to direct access. This might sound okay at first. Until you get hit with some sql injection that scrambles all the varchar fields in your database.

Some people might say that they get around this by using magic quotes or some other way of properly escaping their embedded sql. The problem, though, is the one query a dev didn't escape correctly. Or, the dev that forgot to not allow code to be uploaded. Or, the web server that was cracked which allowed the attacker to upload code. Or,... you get the point. It's hard to cover all your bases.

My point is, all modern databases have security built in. You can simply deny direct table access (select, insert, update, and deletes) and force everything to go through your s'procs. By doing so generic attacks will no longer work. Instead the attacker would have to take the time to learn the intimate details of your system. This increases their "cost" in terms of time spent and stops drive by and worm attacks.

I know we can't secure ourselves against everything, but if you take the time to architect your apps so that the cost to crack it far outweighs the benefits then you are going to serious reduce your potential of data loss. That means taking advantage of all the security tools available to you.

Finally, as to the idea of not using s'procs because you might have to port to a different rdbms: First, most apps don't change database servers. Second, in the event that it's a real possibility, you have to code using ANSI sql anyway; which you can do in your procs. Third, you would have to reevaluate all of your sql code no matter what and it's a whole lot easier when that code is in one place. Fourth, all modern databases now support s'procs. Fifth, when using s'proc's you can custom tune your sql for the database it's running under to take advantage of that particular database's sql extensions.

Chris Lively
One more benefit, it's easier to change sql code in s'procs in an already released application than it is to redeploy an entire application due to a minor query change.
Chris Lively
A: 

A particular scenario you're likely to benefit involves the situation around the "(n+1)" scalability problem. Any kind of multidimensional/hierarchical situation is likely to involve this scenario.

Another scenario would involve use cases where it does some protocol when handling the tables (hint: defined steps which transactions are likely to be involved), this could benefit from locality of reference: Being in the server, queries might benefit. OTOH, you could supply a batch of statements directly into the server. Specially when you're on a XA environment and you have to access federated databases.

aldrinleal
+1  A: 

On top of the speed and security considerations, I tend to stick as much in Stored Procedures as possible for ease of maintenance and alterations. If you put the logic in your application, and find later that sql logic has an error or needs to work differently in some manner, you have to recompile and redeploy the whole app in many cases (especially if it's a client side app such as WPF, Win-Forms, etc). If you keep the logic in the stored proc, all you have to do is update the proc and you never have to touch the application.

BBlake
A: 

If you are talking business logic rather than just "Should I use sprocs in general" I would say you should put business logic in sprocs when you are carrying out large set based operations or any other time executing the logic would require a large number of calls to the db from the app.

Jules 999
A: 

It also depends on your audience. Is ease of installation and portability across DBMSs important to you?

If your program should be easy to install and easy to run on different database systems then you should stay away from stored procedures and also look out for non-portable SQL in your code.

robcast
Yeah yeah, people always cite this as the reason why you should avoid non-standard SQL, but in practice there's hardly ever a reason to swap database vendor (I don't think I've ever seen it done in 30 years in IT except in the most trivial of projects)
Cruachan
+2  A: 

When all the code is in a stored proc, it is far easier to refactor the database when needed. Changes to logic are far easier to push as well. It is also far far easier to performance tune and sooner or later performance tuning becomes necessary for most database applications.

HLGEM