zoukankan      html  css  js  c++  java
  • 【SQL Server学习笔记】Windows主体、SQL Server主体、数据库主体

    主体就是可以被授予权限,访问特定数据库对象的对象。比如,用户登录,角色,应用程序。

    安全对象是可以访问的受到控制的对象。比如表、视图、存储过程、函数、触发器。

    权限是独立的,可以被授予给主体,以访问安全对象,或者未被授予,以阻止访问安全对象。

    主体可以分为3个不同的范围:

    1、Windows级别的主体:基于Windows域用户账号、域用户组、本地用户组的主体。当添加到SQL Server中,并且给予访问对象的权限,那么这类主体将基于Windows身份验证,来获得访问SQL Server所需要的权限。

    Windows级别的主体

    Windows级别的主体通过Windows身份验证,访问SQL Server实例。

    在SQL Server中可以创建基于Windows用户账号、用户组的Windows登录名,它可以属于本地机器,或者属于一个域(Windows登录名可以和域用户、本地用户、用户组进行关联)当添加一个Windows登录名到SQL Server时,这个windows登录名可以对应Windows中的用户名,也可以对应一个Windows用户组。

    添加到SQL Server的windwos登录名不需要独立的密码,就可以登录,登录身份验证的过程是由windows来控制的。

    默认情况下SQL SERVER只允许Administrators组的成员可以连接到数据库,也就是不能用Administrators组来创建windows登录名。 

    CREATE LOGIN loginName  FROM <sources> 
    
    <sources> ::=
        WINDOWS [ WITH <windows_options>[ ,... ] ]
        | CERTIFICATE certname
        | ASYMMETRIC KEY asym_key_name
    
    <windows_options> ::=      
        DEFAULT_DATABASE = database
        | DEFAULT_LANGUAGE = language
    --1.1以windows用户创建登录名
    create login [PC0627JVC\ggg]     --机器名称\用户名
    from windows
    with default_database = wc,      --默认数据库
         default_language = 简体中文  --登录名的默认语言
    
    
    --1.2以windows用户组创建登录名
    create login [PC0627JVC\ora_dba] --机器名称\用户组名
    from windows
    with default_database = wc,      --默认数据库
         default_language = 简体中文  --登录名的默认语言
    
    
    --2.查看windows登录名
    select s.name,
           s.principal_id,
           s.sid,
           s.type_desc,
           s.is_disabled
    from sys.server_principals s
    where s.type_desc in ('WINDOWS_LOGIN',
                          'WINDOWS_GROUP')
    
    
    --3.1改变默认语言,默认数据库
    alter login [PC0627JVC\ggg]
    with default_database = wcc,
         default_language = english
    
    
    --3.2禁用或启用登录名
    alter login [PC0627JVC\ggg]
    disable
    
    alter login [PC0627JVC\ggg]
    enable
    
    
    --4.拒绝widnows登录名访问SQL Server
    --如果用ggg这个账号登陆windows后,就登不上SQL Server了
    deny connect sql to [PC0627JVC\ggg]
    
    
    --5.删除windows登录名
    drop login [PC0627JVC\ora_dba]
    
    drop login [PC0627JVC\ggg]
    
    

    2、SQL Server级别的主体:是SQL Server级别的登录名和固定的服务器角色。在SQL Server中创建的SQL登录名,拥有独立于任何Windows实体的登录名和密码。固定的服务器角色是SQL Server实例级别权限的分组,其他主体能成为它的成员,而且继承了服务器角色的权限,另外,固定服务器角色之所以是固定的,是因为不能添加服务器角色  

    CREATE LOGIN loginName  WITH <option_list1>   
    
    <option_list1> ::= 
        PASSWORD = { 'password' | hashed_password HASHED } [ MUST_CHANGE ]
        [ , <option_list2> [ ,... ] ]
    
    <option_list2> ::=  
        SID = sid
        | DEFAULT_DATABASE = database    
        | DEFAULT_LANGUAGE = language
        | CHECK_EXPIRATION = { ON | OFF}
        | CHECK_POLICY = { ON | OFF}
        | CREDENTIAL = credential_name 
    
    
    --1.1创建sql登录名
    create login ggg
    with password = '123',
         default_database = wc
         
    
    --1.2创建登录名,同时设置密码策略
    create login yg
    with password = '123' must_change,  --在第一次登录时会提示修改密码
         
         check_expiration = on,   --对sql登录名强制实施密码过期策略
         check_policy = on        --把Windows密码策略应用到sql登录名上
         
    
    --1.3查看sql登录名
    select name,
           principal_id,
           sid,
           type_desc,
           is_disabled
    from sys.server_principals 
    where type_desc in ('SQL_LOGIN')
    
    
    
    --2.1修改登录名的密码
    alter login ggg
    with password = '123456'
         old_password = '123'
    
    
    --2.2同时修改登录名和密码
    alter login ggg
    with name = www,
         password = '12345678'
    
    
    --2.2修改登录名的默认数据库
    alter login www
    with default_database = master
    
    
    
    --3.1管理登录名的密码
    select LOGINPROPERTY('www','IsLocked'),
           LOGINPROPERTY('www','IsExpired'),
           LOGINPROPERTY('www','IsMustChange'),
           LOGINPROPERTY('www','BadPasswordCount'),
           LOGINPROPERTY('www','BadPasswordTime'),
           LOGINPROPERTY('www','HistoryLength'),
           LOGINPROPERTY('www','LockoutTime'),
           LOGINPROPERTY('www','PasswordLastSetTime'),
           LOGINPROPERTY('www','PasswordHash')
    
    
    --3.2.删除sql登录名
    drop login www
    
    
    
    --4服务器角色成员
    --4.1查看固定服务器角色
    select name,
           principal_id,
           sid,
           type_desc,
           is_disabled
    from sys.server_principals 
    where type_desc = 'SERVER_ROLE'
    
    
    --显示固定服务器角色
    exec sp_helpsrvrole
    
    
    --4.2把登录名添加到服务器角色
    exec sp_addsrvrolemember 
    	@loginame = 'ggg',
    	@rolename = 'sysadmin'
    	
    
    --4.3删除服务器角色成员,这是就算ggg已经登录到sql server,也会导致ggg无法继续操作
    exec sp_dropsrvrolemember 
    	@loginame = 'ggg',
    	@rolename = 'sysadmin'
    	
    
    --4.4显示固定服务器角色的成员
    select p.name,          --固定服务器角色
           p.principal_id,
           p.sid,
           
           pp.name,         --成员
           pp.principal_id,
           pp.sid
    from sys.server_principals p
    inner join sys.server_role_members r	
            on p.principal_id = r.role_principal_id
    inner join sys.server_principals pp
            on pp.principal_id = r.member_principal_id        
    where p.name = 'sysadmin'
    
    
    --显示服务器角色的成员
    exec sp_helpsrvrolemember
    	@srvrolename = 'sysadmin'
    	        


    3、数据库级别的主体:数据库用户、数据库角色(固定的、用户定义的)、应用程序角色。可以添加数据库角色和应用程序角色。

     需要注意的是,应用程序角色是不包含成员的成组的权限,能够以应用程序角色的身份登录。当使用一个应用程序角色时,它会覆盖登录名的其他所有权限,只授予你应用程序角色的那些权限。 

    CREATE USER user_name 
        [ { { FOR | FROM }
          { 
            LOGIN login_name 
            | CERTIFICATE cert_name 
            | ASYMMETRIC KEY asym_key_name
          } 
          | WITHOUT LOGIN
        ] 
        [ WITH DEFAULT_SCHEMA = schema_name ]
    --1.1创建数据库用户
    create user ggg
    for login ggg
    with default_schema = ggg  --用户的默认架构,如果不存在,会自动创建
    
    
    --1.2显示数据库用户的信息
    exec sp_helpuser 
    	@name_in_db = 'ggg'
    
    
    select name,
           principal_id,
           type_desc,
           default_schema_name,
           sid
    from sys.database_principals
    where type_desc = 'SQL_USER'
    
    
    --1.3修改数据库用户
    alter user ggg
    with default_schema = dbo   --修改默认架构
    
    
    alter user ggg
    with name = wwwc            --修改数据库用户名
    
    
    --1.4删除数据库用户名
    drop user wwwc
    
    
    /*=====================================================
    1.5修复孤立的数据库用户
    
    登录名有一个安全标示符,能唯一标识出这个登录名。
    数据库迁移之后,重新创建登录名,而这个登录名会对应到不同的sid,
    也就是登录名和数据库用户名之间的对应关系可能会变化,
    才会导致孤立的数据库用户
    ======================================================*/
    select DP.name,
           DP.sid,
           DP.principal_id,
           
           SP.name,
           SP.sid
    from sys.database_principals dp
    left join sys.server_principals sp
           on dp.sid = sp.sid 
    where sp.sid is null
          and dp.type_desc = 'SQL_USER'
    
    
    --修改用户,重新指定登录名,来更新数据库用户对应的sid
    ALTER USER GGG
    WITH LOGIN = GGG
    
    
    
    --2.固定数据库角色
    --2.1显示固定数据库角色
    exec sp_helpdbfixedrole 
    	--@rolename = 'db_ddladmin'
    
    
    select name,
           principal_id,
           type_desc,
           default_schema_name ,
           sid,
           
           is_fixed_role
           
    from sys.database_principals
    where type_desc = 'DATABASE_ROLE'
          and is_fixed_role = 1
          
          
          
    --2.2显示固定数据库角色的成员
    exec sp_helprolemember 
    	--@rolename = 'db_ddladmin'
    
    
    select dp.name,
           
           dpp.name,
           dpp.sid
    from sys.database_role_members rm
    inner join sys.database_principals dp
            on dp.principal_id = rm.role_principal_id
    
    inner join sys.database_principals dpp
            on dpp.principal_id = rm.member_principal_id
    
    
    --2.3.管理固定数据库角色成员
    exec sp_addrolemember 
    	@rolename = 'db_datawriter',
    	@membername = 'ggg'
    	
    
    exec sp_droprolemember
    	@rolename = 'db_datawriter',
    	@membername = 'ggg'
    
    
    
    --3.用户定义的数据库角色
    --3.1创建
    create role wc_role authorization db_owner 
    
    
    --3.2修改角色名称
    alter role wc_role
    with name = w_role
    
    
    --3.3给角色添加用户
    exec sp_addrolemember
    	@rolename = 'w_role',
    	@membername = 'ggg'
    
    
    --3.4从角色中删除用户
    exec sp_droprolemember
    	@rolename = 'w_role',
    	@membername = 'ggg'
    
    
    --3.5删除
    drop role wc_role
    	
    	
    
    --4.应用程序角色
    --4.1创建
    create application role www_c
    with password = '123',
         default_schema = dbo
         
    
    --4.2修改
    alter application role www_c
    with name = wwc,
         password = '12345'
    
    
    --4.3授予权限
    grant select on dbo.wcObjects to wwc
    
    
    --4.4激活应用程序角色
    exec sp_setapprole 
    	@rolename = 'wwc',
    	@password ='12345'
    
    
    --4.5查询数据
    select * from dbo.wcObjects
    
    
    --4.6拒绝了对对象 'book' (数据库 'wc',架构 'dbo')的 SELECT 权限。
    select * from dbo.book
    
    
    --4.7删除应用程序角色
    drop application role wwc
    

    查询当前连接的主机的域用户名

    select *
    from sys.server_principals
    where type_desc in ('WINDOWS_LOGIN','WINDOWS_GROUP')
    and CHARINDEX('NT',name)=0
    


  • 相关阅读:
    帝国 标签模板 使用程序代码 去除html标记 并 截取字符串
    iis6 伪静态 iis配置方法 【图解】
    您来自的链接不存在 帝国CMS
    帝国cms Warning: Cannot modify header information headers already sent by...错误【解决方法】
    .fr域名注册 51元注册.fr域名
    帝国网站管理系统 恢复栏目目录 建立目录不成功!请检查目录权限 Godaddy Windows 主机
    星外虚拟主机管理平台 开通数据库 出现Microsoft OLE DB Provider for SQL Server 错误 '8004' 从字符串向 datetime 转换失败
    ASP.NET 自定义控件学习研究
    CSS层叠样式表之CSS解析机制的优先级
    ASP.NET程序员工作面试网络收藏夹
  • 原文地址:https://www.cnblogs.com/momogua/p/8304603.html
Copyright © 2011-2022 走看看