كيف يمكنني الاستعلام في حالة وجود مخطط قاعدة البيانات

StackOverflow https://stackoverflow.com/questions/226042

  •  03-07-2019
  •  | 
  •  

سؤال

وكجزء من عملية الإنشاء لدينا تشغيل برنامج نصي تحديث قاعدة البيانات كما ننشر الرمز إلى 4 بيئات مختلفة. وعلاوة على ذلك، لأن نفس الاستعلام والحصول على إضافة لحتى نسقط على الإطلاق في إنتاج ذلك لديه لتكون قادرة على تشغيل عدة مرات على قاعدة بيانات معينة. مثل هذا:

IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = OBJECT_ID(N'[Table]'))
BEGIN
  CREATE TABLE [Table]
  (...)
END

وحاليا لدي بيان مخطط إنشاء في نشر / بناء النصي. أين يمكنني الاستعلام عن وجود مخطط؟

هل كانت مفيدة؟

المحلول

هل تبحث عن 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> تحتاج إلى تشغيل دفعة واحدة خاصة بها. وهناك عمل حول هو تنفيذ بيان 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

ولمجرد أن يكون <م> خارج "دفاعي"، والنسخة التالية بإنشاء خطأ نوع تحويل لحساب احتمال (ولكن من غير المحتمل) من> 1 مطابقة Schema وعلى غرار كيف رمز التحقق من الصحة استثناء في كثير من الأحيان رمي عمدا بسبب وأعتقد أنه من الجيد أن وأعتقد أنه من "" أفضل الممارسات "لحساب جميع النتائج عائد ممكن ولكن من غير المحتمل، وحتى لو كان مجرد لتوليد استثناء فادح لأن الآثار المعروفة للوقف المعالجة عادة ما تكون أفضل من الآثار المتتالية غير معروف من الامم المتحدة أخطاء -trapped. لأنه من المستبعد جدا، لم أكن أعتقد أنه يستحق عناء فحص Count + Throw منفصلة أو Try-Catch-Throw لتوليد المزيد من خطأ فادح سهل الاستعمال ولكن الخطأ لا يزال قاتل مع ذلك.

و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

وهذه هي قديمة جدا أجد نفسي مضطرا لإضافة: لSQL SERVER 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top