2016-09-08 3 views
1

目標:ログイン結果に基づいて、列の値をリンクサーバーのDBにログイン権限をチェックして、更新T-SQL文を書きます。T-SQL:ログインに失敗した場合、SQL

須藤っぽいコード:

@Source = linked server connection string 

while true 

if exists(select [Something] from [@Source]) 
update [Table] set [Column] = 1 
else 
update [Table] set [Column] = 0 

@Source = next linked server 

アイデアは、私は、テーブルからレコードを取得できない場合は、私がアクセスを持っていないということです。実際のT-SQLを使用してこのクエリを実行すると、ログインに失敗しましたエラーが発生しましたT-SQLを使用してこれを達成したことはありますか?現在私は手動で確認して更新しています。

+0

どのような言語ですか?接続文字列はtsql – Hogan

+0

には意味がありません。答えが正しい方向に進むかどうかを尋ねる場合は、sqlのif文を使用しないでください。 – Hogan

答えて

0

あなたは正しい方向に向かっている場合は、あなたが求めている場合は、私はノーと言うだろう。ここにsudo-ishコードがあります:

-- perform connection to external server. 

-- make update 
update <table> 
    SET <field to indicate result> = <result> 
WHERE <filter to select row> 

ここに別のヒントがあります。あなたはselectに試してみて、あなたが権限を持っていない場合は、エラーが発生しますリンクサーバーを使用している場合<result>

SET <field> = CASE WHEN @login = 'OK' THEN 1 ELSE 0 END 
0

のようなものである可能性があります。これは、単一のステートメントで実行できるものではありません。 IFを使用している場合は、すでにストアドプロシージャを使用していると仮定します。

あなたはこのために設計された機能sp_testlinkedserver(ソートの、まだ例外処理に依存している)を使用することができます。あなたはまだTRY/CATCHのようなものを使用する必要があります

declare @TestedServerReturnValue int 
BEGIN TRY 
    EXEC @TestedServerReturnValue = sys.sp_testlinkedserver @ServerName 
END TRY 
BEGIN CATCH 
    SET @TestedServerReturnValue = @@error 
END CATCH 

IF @TestedServerReturnValue = 0 BEGIN 
    Print 'Success' 
END 
ELSE BEGIN 
    print 'Could not connect' 
END 
+0

これは私が求めているものに近づいています..興味深いのは、サーバーへのログイン機能がありますが、私のアクセス権はDbレベルで終了するということです。したがって、sp_testlinkedserverを使用すると、まだ正常な結果が得られます。 – LostInTheSauce

+0

基本的に私は複数のサーバーを持ち、それぞれにメタデータdbがあります。メタデータdbは、すべてのサーバーで同じスキーマを持ちます。私の目標は、各リンクサーバーから最後の3か月分のメタデータを取得し、そのメタデータをサーバー上の単一のテーブルに配置することです。私はこれを達成するためにspを使用しています。リンクされた各サーバーをループすると、テーブルを照会できないサーバーが発生すると、sp全体が失敗します。ですから、私は、基本的にリンクされたサーバーをスキップするステートメントを作成したいと思っています。 – LostInTheSauce

+0

これを実行すると、カーソルを使ってサーバーのリストをループし、接続をテストしてからselectステートメントをテストします。リカバリが可能な場合は、すべての障害ポイントがTRY/CATCHにあり、残りのサーバを処理できます。 – Brad

関連する問題