1

SQL Server のエキスパートの皆様、こんにちは。

潜在的な解決策についてフィードバックを得たいという奇妙な問題があります。既存の SQL データベースへの ODBC 接続を必要とするアプリケーションを使用しています。ただし、データベースの名前にダッシュ ("-") が含まれているため、アプリケーションで構文エラーが発生します (明らかに、顕著な開発努力ではありませんが、これについて私にできることはありません)。

この問題の一時的な解決策として、データベースのコピーを作成し、ダッシュなしで名前を変更しました。このターゲット データベースは特定のタスクにのみ使用され、頻繁に更新されることはありませんが、数か月ごとに更新されるため、定期的にアクセスして更新する必要があります。開発者からの解決策があることを期待していましたが、彼らは協力していません。

私の質問は次のとおりです。データベースのコピーを更新する必要のないこの問題の解決策はありますか? 元のデータベースの名前を変更することはオプションではありません。ターゲット データベースをコピーに定期的に復元するには、SQL ジョブをセットアップする必要がありますか?

シノニムは可能な解決策ですか?

ありがとう!

編集: 数人が角括弧の使用を指摘しています - これはオプションではありません。DB 名フィールドで括弧を使用しようとすると、アプリケーション GUI でエラーが表示されます。

4

3 に答える 3

2

主要なハッキングアラート-データベースではなく、データベース内のすべての同義語を作成してください!

アプリがシノニムでサポートされているオブジェクトにのみアクセスする必要がある場合は、より適切な名前で別のDBを作成し、元のDBのオブジェクトのシノニムで埋めることができます

create database MyDatabase;
go
use MyDatabase;
go
create synonym [dbo].[MyTable1] for [My-Database].[dbo].[MyTable1];
create synonym [dbo].[MyView2] for [My-Database].[dbo].[MyView2];
create synonym [dbo].[MyProc3] for [My-Database].[dbo].[MyProc3];
...

これを支援するための生成スクリプトを次に示します。

declare @OldDbName sysname = 'My-Database'
select 'create synonym ' + quotename(schema_name(schema_id)) + '.' + quotename(name) + ' for '
    + quotename(@OldDbName) + '.' + quotename(schema_name(schema_id)) + '.' + quotename(name) + ';'
from sys.objects
where schema_name(schema_id) not in ('sys')
    and type in ('AF', 'FN', 'FS', 'FT', 'IF', 'P', 'PC', 'RF', 'TF', 'U', 'V', 'X')
于 2013-02-13T23:24:33.757 に答える
1

ODBC 接続が使用されるコンテキストを提供しませんが、データベースまたはテーブルにダッシュが含まれている場合、SQL または接続文字列で角かっこ [My-Database] で囲まれたデータベース名を使用できることを知っていますか?

于 2013-02-13T22:15:46.193 に答える
1

これを指定していないため、これが特定のコンテキストに直接関連しているかどうかはわかりません...ただし、ここで説明されているように、データベース名を角括弧で囲んでみてください。

http://joseph.randomnetworks.com/2006/09/29/sql-server-escaping-the-database-name/

スペース、ハイフン (「-」)、またはその他の例外的な文字を含むデータベースの名前をエスケープするには、以下の例に示すように、データベース名を角かっこで囲む必要があります。この手法は、予約語でもあるデータベース名 (「primary」など) を選択する場合にも適用する必要があります。

$conn = mssql_connect('SQLSERVERHOST', 'username', 'password');
   mssql_select_db('[database-name]', $conn);
于 2013-02-13T22:16:14.737 に答える