r - 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 库上进行操作。
解决方案
要更改列的数据类型,您必须同时具有表的 ALTER 权限和 UPDATE 权限。
从文档:
添加更新表行的列需要表的 UPDATE 权限。
这也适用于 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
推荐阅读
- javascript - Gulp Concat + Uglify 订单 JS 错误
- java - 在 Spring Boot 控制器中使用 GraphQL API
- php - 在 MySQL 数据库中创建用户
- jenkins - 如何在 Jenkins 共享库函数中存储/取消存储文件
- delphi - Delphi 只复制具有特定扩展名的文件
- cordova - 单击cordova android中的下拉菜单
- python - Python 替换 || 具有 CONCAT 功能的运算符
- unix - 使用 sed 替换通配符
- angular - 如何正确过滤角度数组
- react-native - 当第一次 render() 工作时未定义