一:安全对象是SQ L Server控制访问权限的资源,在SQL Server中的安全对象分为3个嵌套范围。
1、层次最高的是服务器范围。包含了登录名,数据库,端点。
--1.管理服务器权限 use master go if not exists(select name from sys.server_principals where name = 'ggg') begin create login [ggg] with password = 'ggg', default_database = [master], check_expiration = off, check_policy = off end --授予修改跟踪权限 grant> 2、其次是数据库范围,是包含在服务器范围内的,控制数据库用户,数据库角色,安全凭证,架构等安全对象。
--1.管理数据库权限 if not exists(select name from sys.server_principals where name = 'xyz') begin create login [xyz] with password ='xyz', default_database =[master], check_expiration = off, check_policy =off end --创建数据库 if not exists(select name from sys.databases where name = 'test') begin create database test end use test go --创建数据库用户 if not exists(select name from sys.database_principals where name = 'xyz') begin create user xyz for login xyz end --给数据库用户授予修改任何程序集、修改任何证书的权限 grant> 3、最内层是架构范围,它控制安全对象(架构本身)以及架构中的对象(比如:表、视图、存储过程、函数)。
use test go --1.架构的拥有者 --1.1创建架构,拥有者是db_owner角色 create schema wcc authorization db_owner --1.2显示架构的拥有者:db_owner select s.name, --架构名称 dp.name, --架构拥有者 dp.type_desc, --拥有者类型 dp.is_fixed_role --是否固定数据库角色 from sys.schemas s inner join sys.database_principals dp on s.principal_id = dp.principal_id where s.name = 'wcc' --1.3改变架构的所有权> 当前连接在安全对象上的权限
use test go --1.检测当前连接的是否有安全对象的权限 select HAS_PERMS_BY_NAME(null, --安全对象名称 null, --测试权限的安全对象的类名 'VIEW SERVER STATE') --要检查的权限名称 select HAS_PERMS_BY_NAME(DB_NAME(), --安全对象名称 'database', --测试权限的安全对象的类名 'alter') --要检查的权限名称 /*=================================== 语法: { EXEC | EXECUTE ] AS [;] ::= { LOGIN | USER } = 'name' [ WITH { NO REVERT | COOKIE INTO @varbinary_variable } ] | CALLER =====================================*/ --模拟数据库用户wclogin,测试是否对当前数据库有任何的权限 EXECUTE AS user = 'wclogin' GO SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY'); GO REVERT; --是否对表有select的权限 select HAS_PERMS_BY_NAME(SCHEMA_NAME(t.schema_id) + '.' + t.name, 'OBJECT', 'select'), t.* from sys.tables t --是否对某个表的列有select的权限 select HAS_PERMS_BY_NAME('production.product', 'object', 'select', c.name, 'column'), c.* from sys.columns c where object_id = object_id('production.product') --2.当前连接,对于某个安全对象,在这个安全对象类上,有多少权限 select * from sys.fn_my_permissions(null, --安全对象的名称 'server') --要列出权限的安全对象类 select * from sys.fn_my_permissions('production',--安全对象的名称 'schema') --要列出权限的安全对象类 --3.改变安全对象的所有权> 二:权限允许主体在安全对象上执行操作。grant、deny、revoke命令可以用于所有的安全对象范围,用来控制主体到安全对象的访问。grant用于启用对安全对象的访问;deny用于限制访问,可以禁止主体对安全对象的访问权限;revoke可以回收主体对安全对象的访问权限。
sys.fn_builtin_permissions ( [ DEFAULT | NULL ] | empty_string | '' } ) ::= APPLICATION ROLE | ASSEMBLY | ASYMMETRIC KEY | CERTIFICATE | CONTRACT | DATABASE | ENDPOINT | FULLTEXT CATALOG | LOGIN | MESSAGE TYPE | OBJECT | REMOTE SERVICE BINDING | ROLE | ROUTE | SCHEMA | SERVER | SERVICE | SYMMETRIC KEY | TYPE | USER | XML SCHEMA COLLECTION--显示整个服务器所有的权限的层次结构、覆盖结构 ;with temp --显示每个有覆盖权限的权限,在同一权限类别中的覆盖层次,用\\来划分 as ( select>