2012-04-23 12 views
4

私はtSQLtを使っています(Red GateのSQL Testバージョン1.0.0.455で)。 tSQLtは、私はデータベースAの同義語を通じて同じSQL Serverインスタンス上のデータベースBのテーブルの上にtSQLt.FakeTableを実行しようとしていたデータベースAにインストールされている同義語テーブルをFakeTableにしようとするとtSQLtが失敗する

コード:

ALTER PROCEDURE [ 。
ExecのtSQLt.FakeTable 'dbo.Bygning' BEGIN

AS ErrorType109NonTankHasSizeOrVolume] [テストAliasTest];

dbo.Bygning(ObjStatus)値(1)に挿入します。

EXEC tSQLt.AssertEquals 1、1
END; dbo.BygningデータベースB及びObjStatusのテーブルを参照し、データベースAの同義語である

dbo.Bygning

エラーメッセージにカラムれる:

Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 0, current count = 1. 

Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 0, current count = 1. 

Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 0, current count = 1. 

[ErrorType109NonTankHasSizeOrVolume].[test AliasTest] failed: An invalid parameter or option was specified for procedure 'sp_addextendedproperty'.{sp_addextendedproperty,37} 

はtSQLt.FakeTableする方法はあります同義語テーブル?

説明: テストを実行中にエラーメッセージが表示されます。

+0

「EXEC tSQLt.AsserEquals 1,1」は、コードサンプルに含める必要はありませんでした。その行には決して到達しません(失敗は前に起こります)。 – steenhulthin

+0

同じセッションの直前に他のSQL文を実行していましたか? – mellamokb

+0

いいえ、Management Studioを開いた後で唯一のテストとして実行します。 – steenhulthin

答えて

4

tSQLtでは現在のところ同義語の偽装をサポートしていません。しかし、私はこれをサポートするのは簡単かもしれないと思います。私はすぐに次の修正プログラムのプロトタイプを作成し、あなたの問題を解決することを願っています。それを試して確認してもらえますか?それがあなたのために働くならば、私はそれが次のリリースに入ることを確認します。

ALTER PROCEDURE tSQLt.Private_MarkFakeTable 
    @SchemaName NVARCHAR(MAX), 
    @TableName NVARCHAR(MAX), 
    @NewNameOfOriginalTable NVARCHAR(4000) 
AS 
BEGIN 
    DECLARE @UnquotedSchemaName NVARCHAR(MAX);SET @UnquotedSchemaName = OBJECT_SCHEMA_NAME(OBJECT_ID(@SchemaName+'.'[email protected])); 
    DECLARE @UnquotedTableName NVARCHAR(MAX);SET @UnquotedTableName = OBJECT_NAME(OBJECT_ID(@SchemaName+'.'[email protected])); 
    DECLARE @Level1Type NVARCHAR(MAX); 

    SELECT @Level1Type = 
    CASE type 
     WHEN 'SN' THEN 'SYNONYM' 
     ELSE 'TABLE' 
    END 
    FROM sys.objects 
    WHERE object_id = OBJECT_ID(@SchemaName+'.'[email protected]); 


    EXEC sys.sp_addextendedproperty 
     @name = N'tSQLt.FakeTable_OrgTableName', 
     @value = @NewNameOfOriginalTable, 
     @level0type = N'SCHEMA', @level0name = @UnquotedSchemaName, 
     @level1type = N'TABLE', @level1name = @UnquotedTableName; 
END; 
GO 
+0

これ以上の調査では、偽のテーブルを作成しようとすると列が見つからないため、これは機能しません。問題を掘り下げて解決策が出てくるかどうかを見ていきます。 – dennislloydjr

+0

ありがとうございます。それは非常に高く評価されるだろう。私はコードが投稿されたように動作しないことを確認することができます。しかし、あなたの答え "tSQLtは現時点では同義語の偽装をサポートしていません。"正しい。私はバージョン番号を含めるように質問を調整します。 – steenhulthin

2

私は今日これに遭遇し、以下の解決策を考案しました。

組み立てセクションで

:それは私のために働いて

DROP SYNONYM syn_name 
EXEC sp_rename 'syn_name_orig', 'syn_name' 

:次に

CREATE TABLE #mock 
(
    id_item VARCHAR(15), 
    descr_1 VARCHAR(50) 
) 
INSERT INTO #mock 
    (id_item, descr_1) 
VALUES ('123456-01', 'Great description here'), 
     ('123456-02', 'Blue, gnarly, cloud') 
EXEC sp_rename 'syn_name', 'syn_name_orig' 
CREATE SYNONYM syn_name FOR #mock 

行為のセクションの最後にクリーンアップします。その同義語を使用しようとする並行プロセスに副作用があるかもしれませんが、私は開発環境でしかテストを実行しないので、心配していません。

1

私が使用した回避策は、ビューを使用するようにプロダクションコードを変更し、シノニムを使用することです。次に、tSQLt.FakeTableを使用してビューをモックすることができます。

関連する問題