像任何其他表一样处理sys表

时间:2011-04-11 10:59:08

标签: sql sql-server azure

我对MS SQL生成的sys表没有很好的经验,例如INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
我可以将DBName\System Views\下找到的这些视图复制到另一个数据库并像其他任何表一样处理它们(处理它们我的意思是发出sql查询)? 我有什么需要考虑的因素吗?

修改
我需要这样做的原因是因为SQL Azure不支持sys表。我在我的应用程序中使用sys表,因此如果我将它们作为普通表复制到SQL Azure,那么一切正常吗?

1 个答案:

答案 0 :(得分:3)

SQL Azure不支持information_schema,但它支持sys。*表(至少是您需要的表)。

http://msdn.microsoft.com/en-us/library/ee336238.aspx#catalog

您可以使用以下内容:

Select * from sys.foreign_keys fk
inner join sys.foreign_key_columns fkc on fkc.constraint_object_id = fk.object_id

为了让您获取所涉及的列或索引信息,请查看以下sys表sys.tables,sys.indexes和sys.columns。标准的sys目录视图比符合ANSI标准的视图更难使用。

我在评论中谈到的数据库触发器如下。这不会处理在表创建上创建fk的实例,但可以轻松扩展以处理其他情况。这将确保此信息始终准确实现为ddl触发器

--drop trigger test on database
create trigger test on DATABASE
for ALTER_TABLE,RENAME
AS
    set nocount on

    --get XML event and extract table and schema
    DECLARE @data XML
    SET @data = EVENTDATA()

    declare @idoc int
    EXEC sp_xml_preparedocument @idoc OUTPUT, @data

    --indicate if table needs to be reloaded
    declare @boolean bit
    set @boolean = 0

    --check conditions where keys change
    SELECT  @boolean = 1
    FROM       OPENXML (@idoc, '/EVENT_INSTANCE/AlterTableActionList/Create/Constraints',2) x
    SELECT  @boolean = 1
    FROM       OPENXML (@idoc, '/EVENT_INSTANCE/AlterTableActionList/Drop/Constraints',2) x

    if @boolean =1
    begin
        --Create the table initially with below line
        --select * into MyInformationSchemaFKs from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
        --Reloads the table if there are constraint changes
        truncate table MyInformationSchemaFKs
        insert into MyInformationSchemaFKs
        select *  from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
    end

    EXEC sp_xml_removedocument @idoc


go