データベーススキーマが存在するかどうかを照会する方法
-
03-07-2019 - |
質問
ビルドプロセスの一環として、4つの異なる環境にコードを展開するときにデータベース更新スクリプトを実行します。さらに、リリースを実稼働環境にドロップするまで同じクエリが追加されるため、特定のデータベースで複数回実行できるようになります 。このように:
IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = OBJECT_ID(N'[Table]'))
BEGIN
CREATE TABLE [Table]
(...)
END
現在、deployment / buildスクリプトにcreate schemaステートメントがあります。スキーマの存在をどこで照会しますか?
解決
sys.schemas をお探しですか?
IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'jim')
BEGIN
EXEC('CREATE SCHEMA jim')
END
CREATE SCHEMA
は独自のバッチで実行する必要があることに注意してください(以下の回答)
他のヒント
@bdukesは、スキーマが存在するかどうかを判断するのに適切ですが、上記のステートメントはSQL Server 2005では機能しません。CREATE SCHEMA <name>
は、独自のバッチで実行する必要があります。回避策は、execでCREATE SCHEMA
ステートメントを実行することです。
これは、ビルドスクリプトで使用したものです。
IF NOT EXISTS (SELECT 1 FROM sys.schemas WHERE name = '<name>')
BEGIN
-- The schema must be run in its own batch!
EXEC( 'CREATE SCHEMA <name>' );
END
ただ extra <!> quot; defensive <!> quot;であるため、次のバージョンでは<!> gt;の可能性(ただしありそうもない)を説明するために型変換エラーが生成されます。 1一致するSchema
は、検証コードが意図的に例外をスローする方法に似ています。これは、それが良いと信じており、<!> quot; 'best practice' <!> quot;ただし、処理を停止する既知の効果は、トラップされていないエラーの未知のカスケード効果よりも優れているため、致命的な例外を生成するだけの場合でも、考えられるすべての戻り結果を説明します。非常にありそうもないので、よりユーザーフレンドリーな致命的なエラーを生成するために個別のCount
チェック+ Throw
またはTry
-Catch
-<=>のトラブルの価値があるとは思わなかったそれにもかかわらず。
SS 2005-:
declare @HasSchemaX bit
set @HasSchemaX = case (select count(1) from sys.schemas where lower(name) = lower('SchemaX')) when 1 then 1 when 0 then 0 else 'ERROR' end
SS 2008+:
declare @HasSchemaX bit = case (select count(1) from sys.schemas where lower(name) = lower('SchemaX')) when 1 then 1 when 0 then 0 else 'ERROR' end
その後:
if @HasSchemaX = 1
begin
...
end -- if @HasSchemaX = 1
これは古いため、追加する必要があります。SQLSERVER 2008+の場合、これらはすべて(選択部分に対して)動作し、EXECUTE('CREATE SCHEMA <name>')
を使用して実際に否定的な結果で作成します。
DECLARE @schemaName sysname = 'myfunschema';
-- shortest
If EXISTS (SELECT 1 WHERE SCHEMA_ID(@schemaName) IS NOT NULL)
PRINT 'YEA'
ELSE
PRINT 'NOPE'
SELECT DB_NAME() AS dbname WHERE SCHEMA_ID(@schemaName) IS NOT NULL -- nothing returned if not there
IF NOT EXISTS ( SELECT top 1 *
FROM sys.schemas
WHERE name = @schemaName )
PRINT 'WOOPS MISSING'
ELSE
PRINT 'Has Schema'
SELECT SCHEMA_NAME(SCHEMA_ID(@schemaName)) AS SchemaName1 -- null if not there otherwise schema name returned
SELECT SCHEMA_ID(@schemaName) AS SchemaID1-- null if not there otherwise schema id returned
IF EXISTS (
SELECT sd.SchemaExists
FROM (
SELECT
CASE
WHEN SCHEMA_ID(@schemaName) IS NULL THEN 0
WHEN SCHEMA_ID(@schemaName) IS NOT NULL THEN 1
ELSE 0
END AS SchemaExists
) AS sd
WHERE sd.SchemaExists = 1
)
BEGIN
SELECT 'Got it';
END
ELSE
BEGIN
SELECT 'Schema Missing';
END