PRB: Kontext zabezpečení z dynamických příkazů SQL uvnitř uložená procedura

Překlady článku Překlady článku
ID článku: 301299 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Příznaky

Při spuštění uložené procedury s dynamické spuštění dotazu (sp_executesql nebo EXECUTE), může se zobrazit následující chybová zpráva:
Server: Zpráva 229, úroveň 14 5 stav linky 1 ' permission ' oprávnění odepřen objekt ' object ', databáze ' database ', ' owner vlastníka.

Příčina

K tomuto chování dochází, protože dynamické spuštění dotazu (sp_executesql nebo EXECUTE) spustí v samostatné kontextu z hlavní uložená procedura; provádí v kontextu zabezpečení uživatele, který provádí uložené procedury a není v kontextu zabezpečení vlastníka uložené procedury.

Poznámka: je měli vzít toto chování v úvahu při určování řetězce vlastnictví.

Jak potíže obejít

Možné řešení tohoto problému:
  • Máte správně udělit potřebná oprávnění pro každý objekt podkladové uvedené v dynamických spuštění dotazu.
  • Můžete provést příkaz SELECT s klauzulí INTO vytvořit dočasnou tabulku obsahující data v původní tabulce a potom EXEC příkaz SQL proti dočasné tabulky. Toto je vhodná řešení, pokud jsou tabulky týkající se malé.

Další informace

Tento problém demonstruje následující kód:
   create database dynamicSQL
   go
   use dynamicSQL
   create table employee(Name varchar(255), salary money)
   go
   create proc TestError @MySql nvarchar(500) As 
   exec (@mySql)
   go
   set nocount on
   insert employee select 'FunctionFunction', 100000
   insert employee select 'Function', 30000
   set nocount off
   exec sp_addlogin 'FunctionFunction'
   exec sp_adduser 'FunctionFunction'
   exec sp_addlogin 'Function'
   exec sp_adduser 'Function'

   grant execute on TestError to Function

   setuser 'Function'
				
reproduces tohoto problému následující kód:
   go
   declare @Sql varchar(500)
   set @Sql = 'select * from employee where Name = ''FunctionFunction'''
   exec TestError @Sql
				
přetažení dynamicSql testovací databáze a použita v tomto scénáři reprodukci přihlášení pomocí následující kód:
   go
   setuser 
   use master
   drop database dynamicSql
   exec sp_droplogin  'FunctionFunction'
   exec sp_droplogin 'Function'
				
Další informace o vlastnictví řetězech v tématu Použití řetězce vlastnictví v SQL Server Books Online.

Vlastnosti

ID článku: 301299 - Poslední aktualizace: 16. října 2003 - Revize: 3.2
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
Klíčová slova: 
kbmt kbprb KB301299 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:301299

Dejte nám zpětnou vazbu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com