SQL Serverデータベース内のオブジェクトの作成スクリプトを取得する必要があります。作成に使用したのとまったく同じスクリプトが必要です。 SSMSを使用して、既に定義したビューを変更するときのように、スクリプトは、以前に定義したとおりの方法でそこにあります。
T-SQLでこれを行う必要があります。 SQL Serverはデータベースオブジェクトに関連するスクリプトをどこに保存しますか?システムカタログビューで関連するビューが見つかりません。
私が見つけようとしているのは次のようなものです:
select creation_script -- I know this column doesn't exist
from sys.objects
where name = 'CustomersView'
これはT-SQLでは実行できません。すべてのオブジェクトに定義が保存されているわけではないため、テーブルやインデックスなどの基本的なものに対してCREATEスクリプトをリバースエンジニアリングする必要があります。
ホイールを(T-SQLで)再発明するのではなく、適切な処理を行い、この目的専用のコンポーネントをSMO Scripter
クラスで再利用します。すでに利用可能であり、機能し、すべての最新のSQL Serverオブジェクトで最新であり、SMOと共に無料で再配布できます。スクリプトロジックをT-SQLから移動するだけです。
最も包括的な方法は、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]
_から取得するもの。dbo
のようなものであると想定できない場合は、OBJECT_SCHEMA_NAME([object_id])
を介して検出する必要があります。オブジェクトカタログビュー
sys.sql_modules カタログビューには、次のオブジェクトの完全な_CREATE...
_ステートメントがあります(暗号化されたものは、_[definition]
_に対してNULL
を返します):
_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;
_
その他のオブジェクト
以下は、すべてのオブジェクトタイプに関連するメタデータを見つけるためのリソースです。
プロファイラーを少しの間(または拡張イベントまたはサーバー側のトレース)使用し、Management Studioを介して必要なスクリプトのいくつかを生成します。必要なスクリプトオプションがオンになっていることを確認してください。タスクを使用することをお勧めします。データベースレベルでスクリプトを生成します。
とにかく、実行するクエリを確認して、何が関係しているかを把握できることがポイントです。
別のオプションは、新しいデータベースで開始し、DDLトリガーを使用して、オブジェクトを作成または変更するために実行されるすべてを格納することです。次に、実際のスクリプトを使用し、そのときに使用された正確なクエリを使用して、必要なときに簡単にフックできるリポジトリがあります。
数年前、分散管理オブジェクトと sp_OACreate を使用してオンザフライでオブジェクトスクリプトを生成できました。 SQLインスタンスが十分に古い場合は、これらを使用できます。それは驚くほど簡単で操作上信頼できました。
SQL Serverの新しいバージョンには、.Netから呼び出すことができるSMOがあります。