首页 > 解决方案 > SQL Server ALTER datetime to datetime2 不起作用

问题描述

我正在尝试将“datetime”变量转换为“datetime2”格式。

# Load libraries
library(DBI)
library(tidyverse)

# Create dataframe
df <- data.frame("myid" = stringi::stri_rand_strings(5, 5),
                 "mydate" = c(Sys.time(), Sys.time()-1, Sys.time()-2, Sys.time()-3, Sys.time()-4) )

# Create SQL table sschema.ttable
DBI::dbWriteTable(conn = connection,
                  name = DBI::Id(schema = "sschema", table = "ttable"),
                  value = df,
                  overwrite = TRUE,
                  append = FALSE)

# Query for variable type in the SQL table
query <- paste0("exec sp_columns ", "ttable")
query <- DBI::dbSendQuery(connection, query)
res <- NULL
res <- DBI::dbFetch(query)
DBI::dbClearResult(query)
view(res)

# Alter mydate to datetime2
query <- DBI::dbSendStatement(conn = connection,
                              statement = paste0("ALTER TABLE sschema.ttable ALTER COLUMN mydate datetime2"))
DBI::dbFetch(query)
DBI::dbClearResult(query)

但这会导致错误

错误:nanodbc/nanodbc.cpp:1617:00000:[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]对象'ttable'、数据库'dbo'、模式'sschema'的更新权限被拒绝。'ALTER TABLE sschema.ttablename ALTER COLUMN mydate datetime2'

但是,将VARCHAR(10)同一个表中的另一个变量转换为VARCHAR(100)可以正常工作。知道有什么问题吗?如何让这个工作?

我正在使用 Microsoft SQL Azure 版本 12,通过在 RStudio 服务器和 DBI 库上进行操作。

标签: rsql-server

解决方案


要更改列的数据类型,您必须同时具有表的 ALTER 权限和 UPDATE 权限。

从文档:

添加更新表行的列需要表的 UPDATE 权限。

ALTER TABLE - 权限

这也适用于 ALTERing 现有列,您可以像这样验证:

use tempdb
go
revert 
go
if exists(select * from sys.database_principals where name = 'fred')
  drop user fred
go
drop table if exists tablename
go
create user fred without login

create table tablename(id int, variablename varchar(20))
go
grant select on tablename to fred 
--grant update on tablename to fred  --uncomment to clear error
grant alter on schema::dbo to fred

execute as user='fred'
  ALTER TABLE dbo.tablename ALTER COLUMN variablename datetime2
revert 

推荐阅读