Meslektaşım kendi şemasını nasıl aldı?


14

Saklı bir yordam var ki:

  • bir tablonun var olup olmadığını kontrol eder ve eğer varsa masayı düşürür.
  • bu tabloyu tekrar oluşturur
  • daha sonra bu tabloyu yaklaşık 30 sorgu ile doldurur.

Ben (DB Sahibi) bu proc çalıştırmak, her şey amaçlandığı gibi çalışır. Active Directory'deki bir rol aracılığıyla bu veritabanında DROP / CREATE haklarına sahip olan iş arkadaşım bunu yaptığında, bazı şeyler ters gider. Aklımdan geçen şey şudur:

Tablonun oluşturulması, dboşema adından önce açıkça belirtilmedi. Bu, tablo adı verilen bir domain\cowork_id.table_name_heretablo oluşturulmasına neden oldu. Kişisel şemasında oluşturulan bu tablonun yanı sıra, artık veritabanında da şeması var (işlemi çalıştırmadan önce mevcut değildi).

Ne oldu? SQL Server, belirtilmediğinde neden kullanıcının şemalarında tablolar oluşturur dbo?


Yanıtlar:


26

Kural olarak, nesneyi bu şemada oluşturmak istiyorsanız, şemayı açıkça belirtmelisiniz dbo.

Olduğunuz gibi db_owner, varsayılan şemanızdır dbo, bu nedenle nesne oluştururken dbo şeması belirtmediğinizde sorun olmaz. Ancak diğer (Windows) kullanıcılar için aynı değildir.

Kullanıcılarınız Windows groupvarsayılan şeması olmayan üyelerdir . Bu durumda, kullanıcı herhangi bir nesne oluşturduğunda karşılık gelen kullanıcı ve şema oluşturulur; burada belgelenmiştir: CREATE SCHEMA (Transact-SQL)

Örtük Şema ve Kullanıcı Oluşturma

Bazı durumlarda kullanıcı, veritabanı kullanıcı hesabına (veritabanındaki veritabanı sorumlusu) sahip olmadan veritabanını kullanabilir. Bu, aşağıdaki durumlarda olabilir:

Bir oturum açma işleminin CONTROL SERVER ayrıcalıkları vardır.

Bir Windows kullanıcısının tek bir veritabanı kullanıcı hesabı (veritabanındaki bir veritabanı yöneticisi) yoktur, ancak veritabanına bir veritabanı kullanıcı hesabı (Windows grubu için bir veritabanı yöneticisi) olan bir Windows grubunun üyesi olarak erişir.

Veritabanı kullanıcı hesabı olmayan bir kullanıcı varolan bir şemayı belirtmeden bir nesne oluşturduğunda, o kullanıcının veritabanında otomatik olarak bir veritabanı asıl ve varsayılan şeması oluşturulur. Oluşturulan veritabanı asıl ve şeması, kullanıcının SQL Server'a (SQL Server kimlik doğrulama oturum açma adı veya Windows kullanıcı adı) bağlanırken kullandığı adla aynı ada sahip olacaktır.

Bu davranış, Windows gruplarını temel alan kullanıcıların nesne oluşturmalarına ve kendi nesnelerine sahip olmalarına izin vermek için gereklidir. Ancak, istemeden şema ve kullanıcıların oluşturulmasına neden olabilir. Örtülü olarak kullanıcı ve şema oluşturmaktan kaçınmak için, mümkünse açıkça veritabanı ilkeleri oluşturun ve varsayılan bir şema atayın. Veya iki veya üç parçalı nesne adları kullanarak bir veritabanında nesne oluştururken var olan bir şemayı açıkça belirtin.

Sorunu çözmek için , tüm Windows kullanıcıları için dboşema atayın default schemaveya nesneleri oluştururken şemayı açık bir şekilde yazın. Her zaman.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.