2011-12-27 3 views
3

SQL Server 2005を実行しています。ソフトウェアはデータベースと統合されています。残念ながら、ストアドプロシージャを使用するのではなく、直接SQLクエリを作成することを選択しました。これでデータベーススキームが変更されました。問題のクエリはもはや有効ではありません。SQL Serverが実行する前に、古いSQLクエリにパッチを適用しますか?

実行時にT-SQLをSQL Serverにパッチすることは可能ですか?

など。 SQL Serverが特定のデータベースに対してSELECT A FROM InvalidTableを取得すると、クエリは実行される直前にSELECT A FROM ValidTableに変換されます。

編集:DepartmentIDは別のテーブルに移動した

SELECT * FROM DataTable c JOIN Users u ON u.UserName = @P0 AND c.DepartmentID = b2.DepartmentID WHERE c.Status = 0 これが問題のクエリです!

+1

'InvalidTable'という名前のビューを作成し、' Select NewColumnName as ValidTable'を作成することができます。 –

+0

ビューを使って離れたテーブルを置き換えることを検討してください。そうすれば、無効なSQLはすべてビューの存在により有効になります。 – xQbert

+0

ええと、ストアドプロシージャの代わりにSQL(またはLinqなど)を使用することは、必ずしも不合理ではありません。私の批判は、あなたがコントロールできないアプリケーションによってデータベースにアクセスすることであり、そのために問題が発生した原因であるソースにはアクセスできません。 (私はそれがあなたの関与に先立つと仮定しよう!) – Murph

答えて

8

ビューとシノニムを使用して、スキーマの変更を非表示にすることができます。

だから、簡単なこと(のようなInvalidTableは今ValidTableである)のために、あなたはビュー

を必要とする、より複雑なもの(列、結合、テーブルの分割、データ型など)については synonym

CREATE SYNONYM InvalidTable FOR CorrectSchema.ValidTable; 

を定義することができます

CREATE VIEW InvalidTable 
AS 
SELECT 
    col1, col2, 
    CAST(col3 AS varchar(1000)) AS col3, -- fix data type 
    1 AS col4 -- not used now, but expected in legacy calls 
FROM 
    CorrectSchema.ValidTable 
WHERE 
    col5 = 'Something' 
GO 

編集OPが実現した後、彼らは自分自身にbollixedまし

表が存在する場合は、ビューまたはシノニムを持つことができません

同一のデータベース内に同じ名前が付いています。

したがって、別のDBを使用して、従来のアプリで代わりに使用するようにしてください。例では、あなたがそうでなければ、コード

USE legacyDB 
GO 
CREATE VIEW DataTable 
AS 
SELECT 
    * 
FROM 
    CorrectDB.CorrectSchema.ValidTable V 
    JOIN 
    CorrectDB.CorrectSchema.OtherTable O ON ... 
GO 

を変更withoout別のDBを使用することができます仮定して、別のDB内のDataTableを持っていると思い、正しいDBの名前を変更し、名前を変更したDBにすべての非レガシーコードを指します。

+1

ああ、+1私は同義語のアイディアが好きです。それを考えなかった。 –

+0

@Shark:これはコードやテーブルの変更のリリースを管理するためにこれを頻繁に使ってきました。また、ETLタスクでの貧弱な人のパーティションの切り替えにも適しています。 – gbn

+0

良い提案!しかし、列が別のテーブルに移動されたので、これは役に立ちません。 (私の最新のポストを見てください!) – l33t

4

私が考えることができる唯一の方法は、ビューを使用してValidTableの名前を抽象化することです。次のようなものがあります。

含まれるデータベースオブジェクトの数と、その知識が有効か無効かによって、これは大きな頭痛になります。

これは悪い状況です。私が尋ねる最初の質問は、サードパーティアプリケーションのデータベースのデータベーススキーマを変更する理由です。

+0

ありがとう。私はこれを試してみる。 (私たちはデータベーススキームを変更していませんでした。私たちは変更しました!私たちは、古いコードをパッチなしで動作させるために古い統合をしようとしています...) – l33t

関連する問題