Jelenségek
Vegyük a következő esetet:
-
A modelladatbázisban felhasználó által definiált adattípust hozhat létre.
-
A nem rendszergazda felhasználók ezzel az adattípussal próbálnak ideiglenes táblát létrehozni a modelladatbázisban.
Ebben az esetben a felhasználó a következő hibaüzenetet fogja kapni:
Msg 15247, Level 16, State 4, Server <Server name>, Line 1
A felhasználónak nincs engedélye a művelet végrehajtásához.
A probléma oka
A CREATE TABLE webhely Könyvek Online témaköre az Engedélyek csoportban az alábbi megjegyzést tartalmazza:
Ha a CREATE TABLE utasítás bármelyik oszlopa clr-felhasználó által meghatározott típusúnak van definiálva, akkor a típus tulajdonjoga vagy a RÁ VONATKOZÓ engedély tulajdonosa szükséges.
Ez a megjegyzés nem csak a CLR adattípusok, hanem a felhasználók által definiált adattípusok (UDT) esetén is igaz. ACLR-adattípusokviselkedéséről a "Felhasználói típusok használata adatbázisokban" című témakörben, az SQL Server Books Online-ban.
MEGJEGYZÉS: Ez a probléma csak akkor áll elő, ha kifejezetten táblákat hoz létre, és nem amikor select INTO utasításokkal hoz létre táblákat.
Megoldás
Adjon engedélyeket a felhasználó által definiált adattípushoz a megfelelő felhasználóknak az Ok szakaszban javasolt módon. A problémát az alábbi módszerek egyikével is megoldhatja.
1. módszer:Hivatkozási engedély megadása a modelladatbázis nyilvános felhasználója számára.
Például:
CREATE TYPE dbo.udt_money FROM varchar(11) NOT NULL ;
ugrás
GRANT REFERENCES ON TYPE::d bo.udt_money TO public
MEGJEGYZÉS:Mielőtt ezt a módszert használjuk, gondosan mérje fel a biztonsági adatokat, mivel ez az engedély minden új adatbázisra át van va.
2.módszer: Ha nem szeretné, hogy minden új adatbázis megőrizze a felhasználó által definiált adattípus definícióját és engedélyét, egy indítási tárolt eljárást használva létrehozhatja és hozzárendelheti a megfelelő engedélyeket csak ideiglenes adatbázis esetén.
Például:
USE mesteroldal
ugrás
ELJÁRÁS LÉTREHOZÁSA SETUP_UDT_IN_TEMPDB
AS
EXEC ( 'USE tempdb;
CREATE TYPE dbo.udt_money FROM varchar(11) NOT NULL;
GRANT REFERENCES ON TYPE::d bo.udt_money TO public;')
ugrás
EXEC sp_procoption "setup_udt_in_tempdb" , "startup" , 'on'
ugrás
3. módszer:
Ideiglenes táblák használata helyett akkor érdemes táblaváltozókat használni, ha a felhasználói adattípusokat kell használnia az ideiglenes tárolási igényekhez. Ahhoz, hogy a táblaváltozók felhasználó által definiált adattípusra hivatkozni tudjanak, nem kell kifejezetten engedélyt engedélyeznie a felhasználó által definiált adattípushoz.