About myself
My technical
skills
My favorites
My picture album
Shortcut keys
My code library
VB resources
SQLServer
resources
SQLServer books
Replication FAQ
Scripting
resources
ASP resources
Search my site
Sign my
guestbook
Contact
information
SQL Server Articles New
|
NEW!!! Subscribe to my
newsletter:
Want to keep in touch with the
latest in SQL Server world? Email vyaskn@hotmail.com with
'subscribe' in the subject line |
In Microsoft SQL Server
newsgroups, I very often see questions like:
"I
need to change the owner of some 500 tables from admin to
dbo. Is there a quick way of doing this?"
"I need to grant EXECUTE permissions on all my
stored procedures to a particular user. I know I can do
this using GRANT statement, but it's a pain to repeat the
command for each stored procedure. Is there a way
out?"
So, I decided to come up
with this page to show you, how this kind of tasks can be
automated, by letting SQL Server do all the hard work
(It's not really hard for SQL Server ;-) and generate the
scripts for you. Here I will discuss some scenarios, but
you should be able to alter this technique to suit your
own needs.
Idea is to use SELECT statements to output the required
commands. Then you have to copy the output into the query
window , and run it.
I'm discussing the following 5
scenarios here:
Scenario 1 <top>
Changing the owner of all the tables in your database to
dbo:
SELECT 'EXEC
sp_changeobjectowner ''' + TABLE_SCHEMA + '.' +
TABLE_NAME + ''', dbo'
FROM INFORMATION_SCHEMA.TABLES
WHERE
OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA)
+ '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') =
0
AND TABLE_TYPE = 'BASE TABLE' /*Check
the TABLE_TYPE against 'VIEW' to work with
views*/
--AND TABLE_SCHEMA = 'Admin1'
/*To change the owner of tables owned by 'Admin1'
only*/
--AND TABLE_NAME LIKE 'Tbl%'
/*To change the owner of tables starting with a
particular pattern*/
GO |
The
above script outputs the required command. Copy them,
make sure the output is exactly what you wanted, and run
the commands. Make sure you login as dbo before running
this script, for better control.
As you can see, I commented the last two conditions in
the WHERE clause using double hyphens (--). Uncomment
them, change the values as needed, if you have to
customize the output.
Scenario 2 <top>
Granting EXECUTE permissions on all the stored procedures
to a particular user, named WebUser:
SELECT 'GRANT EXECUTE ON [' +
USER_NAME(uid) + '].[' + name + '] TO ' +
'[WebUser]'
FROM sysobjects
WHERE
type = 'P'
AND
OBJECTPROPERTY(OBJECT_ID(QUOTENAME(USER_NAME(uid))
+ '.' + QUOTENAME(name)), 'IsMSShipped') = 0
--AND name LIKE 'Rep%' /*To
grant EXECUTE permission on only procedures
starting with Rep*/
GO |
The
above script outputs the required commands. Copy them,
make sure the output is exactly what you wanted, and run
the commands.
As you can see, I commented the last condition in the WHERE clause using
double hyphens (--). Uncomment it, change the
value as needed, if you have to limit the output to a
particular name pattern of stored procedures.
Scenario 3 <top>
Truncating data from all the tables in a database:
SELECT 'TRUNCATE TABLE ' +
QUOTENAME(TABLE_SCHEMA) + '.' +
QUOTENAME(TABLE_NAME)
FROM INFORMATION_SCHEMA.TABLES
WHERE
OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA)
+ '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') =
0
AND TABLE_TYPE = 'BASE TABLE'
--AND TABLE_SCHEMA = 'Admin1'
/*To truncate tables owned by 'Admin1' only*/
--AND TABLE_NAME LIKE 'Tbl%' /*To truncate tables
starting with a particular pattern*/
GO |
The
above script outputs the required commands. Copy them,
make sure the output is exactly what you wanted, and run
the commands. Make sure you login as dbo before running
this script, for better control.
As you can see, I commented the last two conditions in
the WHERE clause using double hyphens (--). Uncomment
them, change the value as needed, if you have to
customize the output. Note that you will not be able to
truncate a table that is referenced by a foreign key
constraint, in which case you have to use the DELETE command
instead.
Scenario 4 <top>
Temporarily disable the constraints on all the tables,
and re-enable them later:
/*To disable constraints*/
SELECT 'ALTER TABLE ' + QUOTENAME(TABLE_SCHEMA) +
'.' + QUOTENAME(TABLE_NAME) + ' NOCHECK
CONSTRAINT ALL'
FROM INFORMATION_SCHEMA.TABLES
WHERE
OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA)
+ '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') =
0
AND TABLE_TYPE = 'BASE TABLE'
--AND TABLE_SCHEMA = 'Admin1'
/*To disable constraints on tables owned by
'Admin1' only*/
--AND TABLE_NAME LIKE 'Tbl%' /*To disable
constraints on tables starting with a particular
pattern*/
GO
/*To enable constraints*/
SELECT 'ALTER TABLE ' +
QUOTENAME(TABLE_SCHEMA) + '.' +
QUOTENAME(TABLE_NAME) + ' CHECK CONSTRAINT ALL'
FROM INFORMATION_SCHEMA.TABLES
WHERE
OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA)
+ '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') =
0
AND TABLE_TYPE = 'BASE TABLE'
--AND TABLE_SCHEMA = 'Admin1'
/*To enable constraints on tables owned by
'Admin1' only*/
--AND TABLE_NAME LIKE 'Tbl%' /*To enable
constraints on tables starting with a particular
pattern*/
GO |
The
above two scripts output the required commands. Copy
them, make sure the output is exactly what you wanted,
and run the commands. Make sure you login as dbo before
running this script, for better control.
As you can see, I commented the last two conditions in
the WHERE clause using double hyphens (--). Uncomment
them, change the value as needed, if you have to
customize the output.
Scenario 5 <top>
Temporarily disable all the triggers on all the tables,
and re-enable them later:
/*To
disable triggers*/
SELECT 'ALTER TABLE ' +
QUOTENAME(TABLE_SCHEMA) + '.' +
QUOTENAME(TABLE_NAME) + ' DISABLE TRIGGER ALL'
FROM INFORMATION_SCHEMA.TABLES
WHERE
OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA)
+ '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') =
0
AND TABLE_TYPE = 'BASE TABLE'
--AND TABLE_SCHEMA = 'Admin1'
/*To disable triggers on tables owned by 'Admin1'
only*/
--AND TABLE_NAME LIKE 'Tbl%' /*To disable
triggers on tables starting with a particular
pattern*/
GO
/*To enable triggers*/
SELECT 'ALTER TABLE ' +
QUOTENAME(TABLE_SCHEMA) + '.' +
QUOTENAME(TABLE_NAME) + ' ENABLE TRIGGER ALL'
FROM INFORMATION_SCHEMA.TABLES
WHERE
OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA)
+ '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') =
0
AND TABLE_TYPE = 'BASE TABLE'
--AND TABLE_SCHEMA = 'Admin1' /*To enable
triggers on tables owned by 'Admin1' only*/
--AND TABLE_NAME LIKE 'Tbl%' /*To enable triggers
on tables starting with a particular pattern*/
GO |
The
above two scripts output the required commands. Copy
them, make sure the output is exactly what you wanted,
and run the commands. Make sure you login as dbo before
running this script, for better control.
As you can see, I commented the last two conditions in
the WHERE clause using double hyphens (--). Uncomment
them, change the value as needed, if you have to
customize the output.
Write SET NOCOUNT ON at the
beginning of all these scripts to avoid the (n row(s)
affected) message in the output.
Comments? Feedback? Click here to send a mail!
|