كيف يمكنني الاستعلام في حالة وجود مخطط قاعدة البيانات
-
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