Často se stává, že na rozsáhlém projektu pracuje více programátorů. K SQL serveru tito uživatelé přistupují pod různými uživatelskými účty a výsledkem mohou být různí vlastníci databázových objektů, aniž by šlo o záměr.
Jan Svoboda a Michal Rogozný: Často se stává, že na rozsáhlém projektu pracuje více programátorů. K SQL serveru tito uživatelé přistupují pod různými uživatelskými účty a výsledkem mohou být různí vlastníci databázových objektů, aniž by šlo o záměr. Uživatelské účty a skupiny, kterými se přihlašují uživatelé k SQL serveru, se totiž automaticky používají k určování vlastnictví databázových objektů (plná jména).
Ke změně vlastníka konkrétního objektu použijeme systémovou uloženou proceduru sp_ChangeObjectOwner. Tuto systémovou proceduru mohou spouštět pouze členové role db_owner nebo členové rolí db_ddladmin a db_securityadmin.
Syntaxe:
sp_changeobjectowner @objname = `object`, @newowner = `owner`
@objname – je jméno existující tabulky, pohledu, spouště nebo uložené procedury v aktuální databázi. Objekt by měl být kvalifikován včetně plného jména starého vlastníka.
@newowner – je nový vlastník objektu. Musí se jednat o platného MS SQL uživatele nebo roli, rovněž lze užít NT uživatele nebo skupinu (potřebujete-li založit nového uživatele, klikněte v Enterprise Manageru na složku Users v aktuální databázi a stiskněte pravé tlačítko myši. Poté zvolte New Database User ...)
Příklad:
EXEC sp_ChangeObjectOwner @objname = `usr_web.tblSources`, @newowner = `dbo`
Uloženou proceduru můžete spustit z Query Analyzeru, jiné uložené procedury a programového kódu.
Měnit každého vlastníka samostatně je jistě pracné ...
Z tohoto důvodu jsme pro vás napsali uloženou proceduru
sp_ChangeOwnerOfObjects, která vlastníky objektů dokáže změnit "hromadně" a ušetří vám spoustu práce. Vytvořte si tuto proceduru ve vaší databázi a můžete ji rovnou používat. Procedura samozřejmě mění pouze vlastníky objektů založených uživateli a nikoli objektů založených systémem. Jelikož je zde využita uložená systémová procedura
sp_ChangeObjectOwner, váže se možnost jejího spouštění na správné databázové role (viz výše).
Vstupními parametry uložené procedury sp_ChangeOwnerOfObjects jsou:
- @OldOwner….původní vlastník objektu
- @Owner………nový vlastník objektu
- @Type………..typ objektu, u kterého chceme změnit vlastníka
Parametr @Type může nabývat následujících hodnot:
U - User table (tabulka)
V - View (pohled)
TR - Trigger (spoušť)
P - Stored Procedure (uložená procedura)
- všechny čtyři typy objektů
Následuje vlastní uložená procedura sp_ChangeOwnerOfObjects; princip, jakým funguje, snadno zjistíte z komentářů.
Po provedení procedury dostaneme výpis podobný tomuto:
Caution: Changing any part of an object name could break scripts and stored procedures.
The object owner has been changed.
Object name: dbo.Employees
……….
……….
The object owner has been changed.
Object name: dbo.Customers
……….
……….
Novým vlastníkem těchto objektů je usr_web
Celkový počet změněných objektů je 42
Uloženou procedurou můžete změnit buď všechny čtyři typy uživateli založených databázových objektů (tabulky, pohledy, uložené procedury a spouště), nebo pouze jeden konkrétní. Proceduru si můžete upravit například tak, že libovolnou kombinaci parametrů budete posílat jako řetězec s oddělovači a spuštěním uložené procedury můžete změnit najednou např. dva typy objektů.
Malé upozornění na závěr: při změně vlastníků tabulek nezapomeňte rovněž změnit vlastníky spouští. I tuto funkcionalitu můžete začlenit do této procedury tak, že proběhne automaticky.
Proceduru musíte vytvořit a spouštět v každé databázi samostatně. Nelze měnit vlastníky objektů v jiných databázích.
Testováno na: MS SQL 7