web-dev-qa-db-ja.com

T-SQLを介してSQL Serverでオブジェクトスクリプトを取得しますか?

SQL Serverデータベース内のオブジェクトの作成スクリプトを取得する必要があります。作成に使用したのとまったく同じスクリプトが必要です。 SSMSを使用して、既に定義したビューを変更するときのように、スクリプトは、以前に定義したとおりの方法でそこにあります。

T-SQLでこれを行う必要があります。 SQL Serverはデータベースオブジェクトに関連するスクリプトをどこに保存しますか?システムカタログビューで関連するビューが見つかりません。

私が見つけようとしているのは次のようなものです:

select creation_script -- I know this column doesn't exist
from sys.objects
where name = 'CustomersView'
4
Saeed Neamati

これはT-SQLでは実行できません。すべてのオブジェクトに定義が保存されているわけではないため、テーブルやインデックスなどの基本的なものに対してCREATEスクリプトをリバースエンジニアリングする必要があります。

ホイールを(T-SQLで)再発明するのではなく、適切な処理を行い、この目的専用のコンポーネントをSMO Scripter クラスで再利用します。すでに利用可能であり、機能し、すべての最新のSQL Serverオブジェクトで最新であり、SMOと共に無料で再配布できます。スクリプトロジックをT-SQLから移動するだけです。

6
Remus Rusanu

最も包括的な方法は、Remusが answer で提案したSMOを使用することであることに異議はありませんが、この質問はT-SQLを介して情報を取得するように要求し、その情報は一部のオブジェクトに存在します。この情報は次のとおりです。

  • オブジェクトタイプの小さなセットをカバーします
  • GRANT/DENYステートメントは含まれません。ただし、その情報は_sys.database_permissions_および_sys.database_principals_から取得できます。
  • _IF EXISTS DROP_ロジックを含まない
  • _ANSI_NULLS_および_QUOTED_IDENTIFIER_のセッション設定は含まれません。 _sys.sql_modules_および_[uses_ansi_nulls]_フィールドを介して_[uses_quoted_identifier]_から取得するもの。
  • mightにはスキーマ名が含まれていません。スキーマ名がCREATE(またはALTER)ステートメントで明示的に指定されていない場合、スキーマ名は定義の一部にはなりません。スキーマは、作成時にオブジェクトを作成したユーザーのデフォルトスキーマでした。スキーマ名が定義に含まれておらず、dboのようなものであると想定できない場合は、OBJECT_SCHEMA_NAME([object_id])を介して検出する必要があります。

オブジェクトカタログビュー

sys.sql_modules カタログビューには、次のオブジェクトの完全な_CREATE..._ステートメントがあります(暗号化されたものは、_[definition]_に対してNULLを返します):

  • SQLストアドプロシージャ
  • 複製フィルター手順
  • 見る
  • SQL DMLトリガー
  • SQLデータベースレベルのDDLトリガー
  • SQLスカラー関数
  • SQLインラインテーブル値関数
  • SQLテーブル値関数
  • ルール(旧式、スタンドアロン)
  • デフォルト(スタンドアロン、制約ではない)
_SELECT OBJECT_SCHEMA_NAME([object_id]) AS [SchemaName],
       OBJECT_NAME([object_id]) AS [ObjectName],
       *
FROM   sys.sql_modules;
_

sys.check_constraints および sys.default_constraints カタログビューは、それぞれの制約のロジック部分を_[definition]_として返します。

_SELECT *
FROM   sys.check_constraints;

SELECT *
FROM   sys.default_constraints;
_

メタデータ関数

OBJECT_DEFINITION 関数は、指定された_[definition]_に基づいて、前述の3つのカタログビューの_[object_id]_フィールドにある同じデータを返します。

_SELECT so.name,
       so.[type],
       so.type_desc,
       OBJECT_DEFINITION(so.[object_id]) AS [Definiton]
FROM   sys.objects so
WHERE  OBJECT_DEFINITION(so.[object_id]) IS NOT NULL;
_

その他のオブジェクト

以下は、すべてのオブジェクトタイプに関連するメタデータを見つけるためのリソースです。

4
Solomon Rutzky

プロファイラーを少しの間(または拡張イベントまたはサーバー側のトレース)使用し、Management Studioを介して必要なスクリプトのいくつかを生成します。必要なスクリプトオプションがオンになっていることを確認してください。タスクを使用することをお勧めします。データベースレベルでスクリプトを生成します。

とにかく、実行するクエリを確認して、何が関係しているかを把握できることがポイントです。

別のオプションは、新しいデータベースで開始し、DDLトリガーを使用して、オブジェクトを作成または変更するために実行されるすべてを格納することです。次に、実際のスクリプトを使用し、そのときに使用された正確なクエリを使用して、必要なときに簡単にフックできるリポジトリがあります。

2
Rob Farley

数年前、分散管理オブジェクトと sp_OACreate を使用してオンザフライでオブジェクトスクリプトを生成できました。 SQLインスタンスが十分に古い場合は、これらを使用できます。それは驚くほど簡単で操作上信頼できました。

SQL Serverの新しいバージョンには、.Netから呼び出すことができるSMOがあります。

0
Michael Green