AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 158360
Accepted
McNets
McNets
Asked: 2016-12-17 04:00:38 +0800 CST2016-12-17 04:00:38 +0800 CST 2016-12-17 04:00:38 +0800 CST

有没有办法使用 sysconv() 内置函数?

  • 772

如果您使用以下方法获得某些视图的定义sys.sp_helptext:

exec sys.sp_helptext 'sys.columns'

CREATE VIEW sys.columns
AS
  SELECT c.id                                                             AS object_id,
         c.NAME,
         c.colid                                                          AS column_id,
         c.xtype                                                          AS system_type_id,
         c.utype                                                          AS user_type_id,
         c.length                                                         AS max_length,
         c.prec                                                           AS PRECISION,
         c.scale,
         CONVERT(SYSNAME, CollationPropertyFromId(c.collationid, 'name')) AS collation_name,
         sysconv(bit, 1 - ( c.status & 1 ))                               AS is_nullable,-- CPM_NOTNULL  
         sysconv(bit, c.status & 2)                                       AS is_ansi_padded,-- CPM_NOTRIM  
         sysconv(bit, c.status & 8)                                       AS is_rowguidcol,-- CPM_ROWGUIDCOL  
         sysconv(bit, c.status & 4)                                       AS is_identity,-- CPM_IDENTCOL  
         sysconv(bit, c.status & 16)                                      AS is_computed,-- CPM_COMPUTED  
         sysconv(bit, c.status & 32)                                      AS is_filestream,-- CPM_FILESTREAM  
         sysconv(bit, c.status & 0x020000)                                AS is_replicated,-- CPM_REPLICAT  
         sysconv(bit, c.status & 0x040000)                                AS is_non_sql_subscribed,-- CPM_NONSQSSUB  
         sysconv(bit, c.status & 0x080000)                                AS is_merge_published,-- CPM_MERGEREPL  
         sysconv(bit, c.status & 0x100000)                                AS is_dts_replicated,-- CPM_REPLDTS  
         sysconv(bit, c.status & 2048)                                    AS is_xml_document,-- CPM_XML_DOC   
         c.xmlns                                                          AS xml_collection_id,
         c.dflt                                                           AS default_object_id,
         c.chk                                                            AS rule_object_id,
         sysconv(bit, c.status & 0x1000000)                               AS is_sparse,-- CPM_SPARSE  
         sysconv(bit, c.status & 0x2000000)                               AS is_column_set -- CPM_SPARSECOLUMNSET  
  FROM   sys.syscolpars c
  WHERE  number = 0
         AND has_access('CO', c.id) = 1 

有一个函数叫sysconv.

这些视图使用函数“sysconv”,您可以从此视图中选择值而不会收到任何错误消息。

select * from sys.columns;

但是如果我尝试类似的东西:

select sysconv(bit, 375 & 8);

我收到错误:

sysconv 不是可识别的内置函数名称

正如 Martin Smith 指出的那样,此功能可以替换为convert (bit, 375 & 8),但我想知道为什么我可以从此视图中选择值,但我不能在我的查询中使用它,即使 SSMS 通过更改前景颜色将其识别为命令?

sql-server t-sql
  • 1 1 个回答
  • 963 Views

1 个回答

  • Voted
  1. Best Answer
    John K. N.
    2016-12-17T07:34:03+08:002016-12-17T07:34:03+08:00

    视图 sys.columns 是一个系统视图。这个视图是由master数据库中的sys用户提供给你的,是一个没有登录的数据库用户。

    sys 用户有自己的模式 sys,然后用于链接所有 sys.* 对象。

    从 sys.* 对象中进行选择的权限是通过公共 SQL Server 角色的成员身份授予您的。SQL Server 角色 public 对所有 sys.* 架构对象具有 SELECT 权限。

    这就是您被授予权限的方式select * from sys.columns。

    如果您不是公共服务器角色的成员,那么您无权访问任何 sys.* 对象。

    系统用户(脚本)

    USE [master]
    GO
    
    /****** Object:  User [sys]    Script Date: 16.12.2016 15:57:08 ******/
    CREATE USER [sys]
    GO
    

    系统架构(脚本)

    USE [master]
    GO
    
    /****** Object:  Schema [sys]    Script Date: 16.12.2016 15:57:35 ******/
    CREATE SCHEMA [sys]
    GO
    

    公共服务器角色(脚本)

    USE [master]
    GO
    
    /****** Object:  ServerRole [public]    Script Date: 16.12.2016 16:05:05 ******/
    CREATE SERVER ROLE [public]
    GO
    

    公共数据库角色

    还有一个public数据库角色,它以某种方式链接到服务器角色。如果您查询sys.database_principalsmaster 数据库中的(视图),那么您会看到有一个public与服务器角色具有相同 ID 的主体,public即 0。我假设这是 database_role public 和 server_role 之间缺失的链接上市。

    编辑:添加了一些关于数据库角色“public”的信息

    public 角色包含在每个数据库中,包括系统数据库。它不能被删除,您不能从中添加或删除用户。授予 public 角色的权限将被所有其他用户和角色继承,因为它们默认属于 public 角色。仅授予 public 您希望所有用户拥有的权限。

    引用SQL Server 中的服务器和数据库角色,部分:“公共角色”

    如果您public在 master 数据库中检索数据库角色的权限,您将获得以下清单:

    询问:

    SELECT 
       OBJECT_NAME(dp.major_id) AS OBJECT , 
       USER_NAME(dp.grantee_principal_id) AS grantee, 
       USER_NAME(dp.grantor_principal_id) AS grantor, 
      dp.permission_name
    FROM sys.database_permissions AS dp 
    WHERE dp.grantee_principal_id = 0
    

    结果:

    sp_MSalreadyhavegeneration  public dbo EXECUTE
    sp_MSwritemergeperfcounter  public dbo EXECUTE
    TABLE_PRIVILEGES            public dbo SELECT
    sp_replsetsyncstatus        public dbo EXECUTE
    sp_replshowcmds             public dbo EXECUTE
    sp_publishdb                public dbo EXECUTE
    dm_pdw_nodes_os_tasks       public dbo SELECT
    ...
    [truncated]
    

    回到您使用 sys.colums 视图的示例:您已被授予从视图中选择的权限,但您无权直接实际执行 sysconv 函数,这是结果集中列的定义. 它已经从你窥探的眼睛隐藏。

    • 2

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve